.NET 5 Web API使用AddIdentity时Claims FindFirstValue取值失效问题
问题原因
AddIdentity<TUser, TRole>方法默认会自动注册Cookie身份验证作为默认的认证、质询、登录方案,覆盖了你后续配置的JWT默认认证方案。这就导致携带JWT令牌的请求进入接口时,系统优先走Cookie身份校验逻辑,校验失败后不会正确解析JWT中的Claims,所以User.FindFirstValue(ClaimTypes.Email)获取到的值为null,传入FindByEmailAsync方法时触发空参数报错。- 而
AddIdentityCore<TUser>仅注册身份核心服务,不会默认添加Cookie认证相关配置,所以你后续配置的JWT认证可以正常生效,Claims可以正常读取。
注意:以上结论基于你现有令牌生成逻辑正确、请求头中已经正确携带Bearer {令牌}格式的认证信息为前提。
解决办法
任选以下一种方案即可修复:
方案1:显式指定JWT为默认身份验证方案
在配置服务时,修改AddAuthentication的配置,明确指定所有常用认证方案为JWT:
services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = key, ValidateIssuer = false, ValidateAudience = false, }; });
方案2:在Authorize特性上指定使用JWT认证方案
在需要JWT校验的接口的[Authorize]特性上显式指定认证方案:
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] [HttpGet] public async Task<ActionResult<UserDto>> GetCurrentUser() { // 原有逻辑不变 }
方案3:配置IdentityOptions覆盖默认认证方案
在AddIdentity的配置块中,直接修改Identity的默认认证方案为JWT:
services.AddIdentity<ApplicationUser, IdentityRole>(opt => { opt.User.RequireUniqueEmail = true; // 新增以下配置 opt.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; opt.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddEntityFrameworkStores<DataContext>() .AddSignInManager<SignInManager<ApplicationUser>>();
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

