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

.NET 8使用Microsoft.AspNetCore.Authentication.JwtBearer 8.0.3遇401未授权

.NET 8升级后使用Microsoft.AspNetCore.Authentication.JwtBearer 8.0.3出现401无效令牌问题

升级到.NET 8并将JwtBearer包更新至8.0.3后,可正常获取Token但授权请求返回401,错误信息显示invalid_token,回退到7.0.17版本则功能正常。

可能的原因及修复方案

1. iat声明格式不符合JWT标准

你的Token生成代码中,iat(Issued At)声明使用了DateTime.UtcNow.ToString(),这是错误的格式——JWT标准要求iat必须是Unix时间戳(从1970-01-01 UTC到当前时间的秒数),而非字符串格式的日期。.NET 8的JwtBearer中间件对格式验证更严格,会直接拒绝这类格式错误的令牌。

修复代码:

new Claim(JwtRegisteredClaimNames.Iat, DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString(), ClaimValueTypes.Integer64)

2. 验证配置与Token生成参数不一致

确保Program.cs/Startup.cs中的JWT验证配置,和生成Token时使用的Issuer、Audience、密钥完全匹配:

示例验证配置:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = builder.Configuration["Jwt:Issuer"],
            ValidAudience = builder.Configuration["Jwt:Audience"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:JwtKey"]))
        };
    });

重点核对:

  • ValidIssuer与生成Token时的_configuration["Jwt:Issuer"]完全一致
  • ValidAudience与生成Token时的_configuration["Jwt:Audience"]完全一致
  • IssuerSigningKey使用的密钥和生成Token时的Jwt:JwtKey完全相同

3. 启用详细日志定位具体错误

在appsettings.json中开启身份验证模块的Debug级日志,可获取invalid_token的具体失败原因:

{
  "Logging": {
    "LogLevel": {
      "Microsoft.AspNetCore.Authentication": "Debug"
    }
  }
}

启动应用后查看日志输出,会明确显示验证失败的细节(如签名不匹配、声明格式错误、令牌过期等)。

4. 确认签名算法一致性

确保生成Token时使用的SecurityAlgorithms.HmacSha256,与验证配置中的算法要求一致。若有自定义算法设置,两端必须保持统一。

内容的提问来源于stack exchange,提问作者Shubhojeet Banerjee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 17:52:42