.NET 6 Minimal API使用JWT授权返回401错误,求问题排查
JWT认证返回401错误的排查方案
已知信息
JWT Payload内容
{ "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress": "sysadmin", "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname": "", "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname": "", "http://schemas.microsoft.com/ws/2008/06/identity/claims/role": "Administrators", "exp": 1667578481, "iss": "ISSUER", "aud": "AUDIENCE" }
项目认证配置
builder.Services.AddAuthorization(); builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, opts => { opts.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = "ISSUER", ValidAudience = "AUDIENCE", IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(key)) }; }); ... app.UseAuthentication(); app.UseAuthorization();
API端点配置
[Authorize] IResult GetForcast() { ... }
可能的问题及解决办法
- 签名密钥不匹配:确认
key变量的值和生成JWT时使用的签名密钥完全一致,注意大小写、特殊字符,以及编码差异。如果生成JWT用的是UTF-8编码的密钥,把Encoding.ASCII改成Encoding.UTF8。 - Token传递方式错误:请求时必须在
Authorization请求头中携带Token,格式为Bearer <你的JWT字符串>,不能遗漏Bearer前缀,也不要有多余空格。 - Token已过期:
exp字段的时间戳1667578481对应2022年11月左右,检查当前时间是否已超过该期限,过期的话重新获取有效Token。 - 中间件顺序错误:确保
app.UseAuthentication()在app.UseAuthorization()之前执行,且要放在端点映射(比如app.MapControllers())之前,顺序颠倒会导致认证逻辑不生效。 - 默认认证方案未明确:可以在
AddAuthentication中直接指定默认Scheme,避免Scheme匹配问题:builder.Services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(...); - 查看详细错误日志:在
appsettings.json中添加日志配置,获取认证失败的具体原因:{ "Logging": { "LogLevel": { "Microsoft.AspNetCore.Authentication": "Debug" } } }
内容的提问来源于stack exchange,提问作者brent.reynolds
相关产品推荐
相关产品推荐

