asp.net-core - 成功登录后,HttpContext.User.Claims 和 IHttpContextAccessor 都返回空值
问题描述
HttpContext.User.Claims 和 IHttpContextAccessor 在 .NET Core 2.2 中成功登录后都返回空值 这是我的启动服务,
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")
,b=>b.MigrationsAssembly("AdaptiveBizapp")));
services.AddDbContext<Project_Cost_Management_SystemContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("Project_Cost_Management_SystemContext")
, b => b.MigrationsAssembly("AdaptiveBizapp")));
services.AddDefaultIdentity<ApplicationUser>()
.AddRoles<ApplicationRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => false;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.ConfigureApplicationCookie(options => {
options.LoginPath = "/Account/login";
options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
});
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
// Set a short timeout for easy testing.
options.IdleTimeout = TimeSpan.FromMinutes(30);
options.Cookie.HttpOnly = true;
// Make the session cookie essential
options.Cookie.IsEssential = true;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
和我的配置部分,
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseSession();
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
routes.MapRoute(
name: "area",
template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
});
我使用了基于身份和角色的授权。登录成功后,在 HomeController 中读取用户声明或 NameIdentifier 为空。但是当我在同一个 LoginController 中读取时,它在 ClaimPrincipal 处具有价值,
public async override Task<ClaimsPrincipal> CreateAsync(ApplicationUser user)
{
var principal =await base.CreateAsync(user);
// Add your claims here
((ClaimsIdentity)principal.Identity).
AddClaims(new[] {
new System.Security.Claims.Claim(ClaimTypes.NameIdentifier,
user.UserName.ToString())
});
return principal;
}
解决方案
找了一天,终于弄明白了。索赔在下一次调用服务器时被水合。希望这篇文章可以帮助其他人。如果您遵循 microsoft 的文档,那您很好,但不要尝试在与设置它们时相同的调用中获取声明。再打一个电话,他们就会补水。
推荐阅读
- arrays - 找不到“object”类型的不同支持对象“[object Object]”。NgFor 仅支持绑定到 Iterables,例如 Arrays。角
- mysql - MySQL:多表 - 一对多关系,获取子列之一不为空的列
- android - 如何通过 ArcGIS Runtime for Android 使用 GeoWebCache 中发布的地图
- mysql - 在 NATURAL JOIN 上使用 WHERE 子句
- nativescript - 在 nativescript-vue 的 FlexboxLayout 中将标签居中
- excel - 如何在不显示工作簿的情况下触发/初始化 Excel VB 用户表单?
- asp.net - SQL Server 使用 ASP.NET 检索数据
- python - 用 QLCDNumber.display() 和 PyQt 显示数字
- apache-spark - 更新和插入
- python - Flask - 如何在不重定向的情况下将变量发送到不同的路由?