简体   繁体   English

ClaimTypes.NameIdentifier 始终返回 null

[英]ClaimTypes.NameIdentifier always return null

actually am new in asp.net core 3.1, i am trying to create user login and register with cookies when i am try to get ClaimTypes.NameIdentifier always return null, can you help me please?实际上是 asp.net 核心 3.1 中的新功能,我正在尝试创建用户登录并在 cookies 上注册,当我尝试获取ClaimTypes.NameIdentifier时总是返回 null,你能帮帮我吗? controller code controller 代码

public class AccountController : ControllerBase
    {
        private readonly ApiSiteDbContext _db;
        private readonly UserManager<AppUser> _userManager;
        private readonly SignInManager<AppUser> _signInManager;
        private readonly RoleManager<AppRole> _roleManager;

        public AccountController(ApiSiteDbContext db,
            UserManager<AppUser> userManager,
            SignInManager<AppUser> signInManager,
            RoleManager<AppRole> roleManager)
        {
            _db = db;
            _userManager = userManager;
            _signInManager = signInManager;
            _roleManager = roleManager;
        }

        [AllowAnonymous]
        [HttpPost("Login")]
        public async Task<IActionResult> Login(LoginModel loginModel)
        {                
            var user = await _userManager.FindByEmailAsync(loginModel.Email);
                          
           // **** this is always return null ***** 
            var id = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
            if (id != null)
            {
                return BadRequest("User already logged !!");
            }

            var result = await _signInManager.PasswordSignInAsync(user, loginModel.Password, loginModel.RememberMe, true);
            if (result.Succeeded)
            {
                if (await _roleManager.RoleExistsAsync("User"))
                {
                    if (!await _userManager.IsInRoleAsync(user, "User"))
                    {
                        await _userManager.AddToRoleAsync(user, "User");
                    }
                }

                var roleName = await GetRoleNameByUserId(user.Id);
                if (roleName != null)
                {
                    AddCookies(user.UserName, user.Id, roleName,  loginModel.RememberMe, user.Email);
                }
                return Ok();
            }
            else if (result.IsLockedOut)
            {
                return Unauthorized("Your account were locked");
            }
            return BadRequest("Wrong  password!");
            //return StatusCode(StatusCodes.Status204NoContent);
        }

        public async void AddCookies(string userName, string userId, string roleName, bool remember, string email)
        {
            var claim = new List<Claim>
            {
                new Claim(ClaimTypes.Name, userName),
                new Claim(ClaimTypes.Email, email),
                new Claim(ClaimTypes.NameIdentifier, userId),
                new Claim(ClaimTypes.Role, roleName),
            };

            var claimIdentity = new ClaimsIdentity(claim, CookieAuthenticationDefaults.AuthenticationScheme);
            if (remember)
            {
                var authProperties = new AuthenticationProperties
                {
                    AllowRefresh = true,
                    IsPersistent = true,
                    ExpiresUtc = DateTime.UtcNow.AddDays(10)
                };

                await HttpContext.SignInAsync
                    (
                        CookieAuthenticationDefaults.AuthenticationScheme,
                        new ClaimsPrincipal(claimIdentity),
                        authProperties
                    );
            }
            else
            {
                var authProperties = new AuthenticationProperties
                {
                    AllowRefresh = true,
                    IsPersistent = false,
                    ExpiresUtc = DateTime.UtcNow.AddMinutes(30)
                };

                await HttpContext.SignInAsync
                    (
                        CookieAuthenticationDefaults.AuthenticationScheme,
                        new ClaimsPrincipal(claimIdentity),
                        authProperties
                    );
            }
        }
    }

and in Startup.cs在 Startup.cs 中

 public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                options.CheckConsentNeeded = Context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });
            services.AddControllers();
            //services.AddControllersWithViews();
           
            services.AddDbContext<ApiSiteDbContext>();
            services.AddIdentity<AppUser, AppRole>(option =>
            {
                option.Password.RequireDigit = true;
                option.Password.RequiredLength = 6;
                option.Password.RequiredUniqueChars = 0;
                option.Password.RequireLowercase = true;
                option.Password.RequireNonAlphanumeric = true;
                option.Password.RequireUppercase = true;
                option.SignIn.RequireConfirmedEmail = true;
                option.Lockout.MaxFailedAccessAttempts = 5;
                option.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(10);
            }).AddEntityFrameworkStores<ApiSiteDbContext>()
          .AddDefaultTokenProviders();


            services.AddAuthentication(options =>
            {
                options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            })
            .AddCookie(options =>
            {
                options.Cookie.HttpOnly = true;
                options.ExpireTimeSpan = TimeSpan.FromMinutes(30);
                options.LogoutPath = "/api/Account/Logout";
                //options.LoginPath = "/api/Account/Login";
                //options.AccessDeniedPath = "/api/Account/accessDenied";
                options.SlidingExpiration = true;
            });


            services.AddMvc(options => options.EnableEndpointRouting = false)
              .SetCompatibilityVersion(Microsoft.AspNetCore.Mvc.CompatibilityVersion.Version_3_0);

            services.AddCors();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseCors(x => x.WithOrigins("http://localhost:4200").AllowAnyHeader().AllowAnyMethod().AllowCredentials());
            app.UseMvc();
            app.UseCookiePolicy();

            app.UseAuthentication();
            
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }

when i make this variable to check the NameIdentifier if return id or not before i use it in a different controller.当我在不同的 controller 中使用它之前让这个变量检查 NameIdentifier 是否返回 id 时。

Make sure that the roleName variable is not a null or string empty, because adding cookies depends on this condition确保 roleName 变量不是 null 或字符串空,因为添加 cookies 取决于此条件

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 ClaimTypes.NameIdentifier 在 Blazor WebAssembly ASP.NET 核心托管中始终返回 null - ClaimTypes.NameIdentifier returns always null in Blazor WebAssembly ASP.NET Core Hosted 为什么 ClaimTypes.NameIdentifier 没有映射到“sub”? - Why is ClaimTypes.NameIdentifier not mapping to 'sub'? 无法从 ClaimTypes.NameIdentifier 检索名称 - Unable to retrieve name from ClaimTypes.NameIdentifier Azure ACS-我应该加密ClaimTypes.NameIdentifier信息吗? - Azure ACS - Should I encrypt ClaimTypes.NameIdentifier information? User.FindFirst(ClaimTypes.NameIdentifier) 从前端调用时不检索任何内容(Angular) - User.FindFirst(ClaimTypes.NameIdentifier) doesn't retrieve anything when called from frontend (Angular) User.FindFirst(ClaimTypes.NameIdentifier) - NullReferenceException 来自 Angular 但在 Postman 中可以吗? - User.FindFirst(ClaimTypes.NameIdentifier) - NullReferenceException from Angular but OK in Postman? JwtToken-索赔名称JwtTokenTypes.Subject解析为ClaimTypes.NameIdentifier,这是为什么,如何防止? - JwtToken - claim name JwtTokenTypes.Subject resolved to ClaimTypes.NameIdentifier, why is that and how to prevent? Cookie始终返回Null - Cookie Always return Null ExecuteScalar()始终返回NULL - ExecuteScalar() always return NULL 值始终返回null - Value always return null
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM