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

ASP.NET 7生成JWT令牌后出现401未授权错误的排查方法

ASP.NET 7 JWT 401 Unauthorized 问题排查方案

一、中间件顺序错误(最常见诱因)

你的Program.cs中把授权中间件放在了认证中间件前面:

app.UseAuthorization();
app.UseAuthentication();

ASP.NET的中间件按顺序执行,授权逻辑会先于认证运行,此时身份未被验证,直接返回401。

修复方式:调整中间件顺序,先执行认证再执行授权:

app.UseAuthentication();
app.UseAuthorization();

二、令牌生成与验证的密钥不匹配

生成令牌和认证配置中使用的Settings.Secret必须完全一致,需排查:

  • 确认Settings.Secret在配置文件(如appsettings.json)中正确加载,键名无拼写错误
  • 检查编码一致性:你代码中都用了Encoding.ASCII.GetBytes,但如果Secret包含非ASCII字符,会导致字节数组不一致,建议改用Encoding.UTF8(如果Secret有特殊字符)
  • 确保开发/生产环境的Secret配置完全相同,避免环境差异导致验证失败

三、请求头格式错误

Authorization头的格式必须严格为Bearer + 令牌字符串,注意:

  • Bearer与令牌之间必须有且仅有一个空格
  • Postman测试时,直接选择"Authorization"标签的"Bearer Token"类型粘贴令牌,避免手动输入时出现空格、拼写错误
  • 前端请求时,确保没有在令牌前后添加多余引号或空格

四、令牌有效性问题

  • 令牌过期:检查生成令牌时的Expires = DateTime.UtcNow.AddHours(2),确认服务器时间与本地时间无较大偏差,避免令牌被判定为过期
  • 令牌篡改:用JwtSecurityTokenHandler在本地解析令牌,检查Payload内容和签名是否正确,示例代码:
var tokenHandler = new JwtSecurityTokenHandler();
var jwtToken = tokenHandler.ReadJwtToken(tokenString);
// 查看Claims、过期时间等信息

五、API端点未正确配置授权

确保需要验证的API控制器或方法上添加了[Authorize]特性,否则授权逻辑不会触发;如果添加了特性仍报错,确认特性未被[AllowAnonymous]覆盖。

六、启用详细日志定位根因

在appsettings.json中开启认证相关的Debug日志,查看具体失败原因:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore.Authentication": "Debug"
    }
  }
}

运行程序后,控制台或日志文件会输出JWT验证失败的具体细节(如签名无效、令牌格式错误、声明不匹配等)。

七、代码潜在问题排查

  • 确认TokenService.GenerateToken方法是否正确返回令牌,排查是否有异常被静默捕获导致返回空值
  • 检查EstablishmentLoginDTO.Email是否有有效值,避免生成的令牌中email声明为空

内容的提问来源于stack exchange,提问作者João Marcos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 22:24:54