You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级至.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 18:33:25