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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:22:27