升级至.NET 8后JWT认证失败,持续返回401响应
.NET 8升级后JWT授权策略失效(401未授权)解决方案
问题根源
你的JWT配置中使用了自定义SignatureValidator直接返回JwtSecurityToken,但.NET 8对JWT验证流程的Claims映射逻辑做了调整,这种写法会导致Token中的Claims无法被正确加载到ClaimsPrincipal中,进而触发授权策略WithUserIdOnly检查"uid" Claim时失败,返回401。
修复方案
方案一:移除自定义SignatureValidator(推荐)
既然你已经关闭了所有JWT验证项(签名、有效期、颁发者等),完全不需要自定义签名验证逻辑,直接删除SignatureValidator配置即可:
services.AddAuthentication(opt => { opt.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; opt.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = false, ValidateAudience = false, ValidateLifetime = false, ValidateIssuerSigningKey = false, NameClaimType = "uid", ValidateActor = false, ValidateSignatureLast = false, ValidateTokenReplay = false, ValidateWithLKG = false // 移除SignatureValidator配置 }; }); services.AddAuthorizationBuilder() .AddPolicy("WithUserIdOnly", policy => policy.RequireClaim("uid"));
方案二:修正自定义SignatureValidator(若必须保留)
如果业务上确实需要自定义签名验证逻辑,需确保返回的JwtSecurityToken能被框架正确处理:
SignatureValidator = (token, parameters) => { var jwtToken = new JwtSecurityToken(token); // 此处可添加自定义签名验证逻辑(如果需要) return jwtToken; }
但仍建议优先使用方案一,因为关闭所有验证后,自定义签名验证已无实际意义。
额外检查项
- 确认请求头的
Authorization格式正确:Bearer {你的JWT Token} - 解码JWT Token,确保Payload中确实包含
"uid"字段(Claim名称区分大小写)
内容的提问来源于stack exchange,提问作者Mehrdad
相关产品推荐
相关产品推荐

