首页 > 解决方案 > 成功登录后,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;
        }

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

标签: asp.net-core.net-coreasp.net-identityclaims-based-identity

解决方案


找了一天,终于弄明白了。索赔在下一次调用服务器时被水合。希望这篇文章可以帮助其他人。如果您遵循 microsoft 的文档,那您很好,但不要尝试在与设置它们时相同的调用中获取声明。再打一个电话,他们就会补水。


推荐阅读