.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
相关产品推荐
相关产品推荐

