Swagger中JWT Token正确但调用接口返回401错误排查求助
JWT Token有效但接口返回401的排查方案
常见问题排查点
- Token验证参数不匹配:检查
appsettings.json中的JWT配置(密钥、颁发者、受众)是否和生成Token时的参数完全一致,哪怕大小写、末尾空格都会导致验证失败。 - 中间件顺序错误:确保
Program.cs中AddAuthentication和AddAuthorization的配置顺序正确,且UseAuthentication必须在UseAuthorization之前调用,否则请求不会先执行身份验证。 - Token声明缺失或不匹配:生成Token时是否包含必要声明(如
sub、exp),若控制器/方法使用了[Authorize(Roles="XXX")],需确认Token中是否包含对应角色声明,缺失则会返回401。 - Swagger Token传递格式错误:在Swagger中调用接口时,需将Token放在
Authorization请求头中,格式必须为Bearer {Token},注意Bearer后需加空格。 - Token过期时间异常:验证Token的
exp声明是否在当前时间之后,哪怕过期几秒也会导致验证失败。
针对提供文件的具体检查步骤
1. Program.cs
- 确认
AddJwtBearer配置参数与生成Token时完全一致,示例正确配置:
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:Key"])) }; }); // 必须保证中间件顺序正确 app.UseAuthentication(); app.UseAuthorization();
- 检查全局授权策略是否正确应用,或需授权的端点是否添加了
[Authorize]属性。
2. appsettings.json
- 验证JWT配置项无拼写错误,密钥长度至少16字符:
{ "Jwt": { "Key": "Your_Secure_Long_Key_Here", "Issuer": "Your_Issuer_Name", "Audience": "Your_Audience_Name", "ExpireMinutes": 60 } }
3. AuthenticationController.cs
- 检查生成Token的代码是否使用了和验证一致的参数:
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"])); var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( issuer: _configuration["Jwt:Issuer"], audience: _configuration["Jwt:Audience"], expires: DateTime.Now.AddMinutes(Convert.ToDouble(_configuration["Jwt:ExpireMinutes"])), signingCredentials: credentials, claims: new List<Claim> { new Claim(ClaimTypes.Name, user.Username) } // 确保包含必要声明 ); return new JwtSecurityTokenHandler().WriteToken(token);
- 确认
issuer、audience、签名算法与验证配置完全匹配。
快速验证方法
- 用JWT解析工具解析生成的Token,检查
exp时间是否有效、声明是否正确,将appsettings.json中的密钥输入工具验证签名是否通过。 - 改用Postman手动添加
Authorization: Bearer {Token}请求头调用接口,排除Swagger的传递问题。
内容的提问来源于stack exchange,提问作者Ellen Shuro
相关产品推荐
相关产品推荐

