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

ASP.NET Core中JWT身份验证遇401 Unauthorized问题求助

ASP.NET Core JWT身份验证401未授权问题排查与解决

问题概述

在ASP.NET Core项目中基于JWT实现身份验证与授权,登录成功获取令牌后,在Swagger中粘贴令牌访问RoleCRUDController时返回401 Unauthorized,日志显示AuthenticationScheme: Bearer was challenged.。

排查步骤与解决方案

1. 检查Swagger令牌输入格式

这是最常见的错误:在Swagger的Authorization对话框中,必须输入**Bearer <你的JWT令牌>**,注意Bearer与令牌之间有一个空格,不能仅粘贴令牌字符串。

2. 验证令牌内容与配置一致性

将获取到的JWT令牌复制到JWT解析工具中,核对以下核心字段:

  • iss(签发者):必须与AuthConfig.ISSUER(randomauthserver)完全一致
  • aud(受众):必须与AuthConfig.AUDIENCE(randomauthclient.com)完全一致
  • exp(过期时间):确认令牌未超过有效期
  • 签名验证:确保工具显示"Signature verified",若未验证通过,说明签名密钥不匹配

3. 修复密钥拼写错误

注意到AuthConfig.cs中的密钥存在拼写错误:

public const string KEY = "randomrandomradndomrandomrandom_randomsecret@123123!!!";   
// 其中"radndom"应为"random"

虽然生成令牌和验证时使用的是同一个错误密钥,但建议修正为正确字符串,避免后续维护出现不一致问题,确保生成与验证逻辑使用完全相同的密钥。

4. 调整日志级别获取详细错误信息

修改appsettings.json中的日志配置,增加JWT验证的Debug级日志:

"Logging": {
  "Console": {
    "LogLevel": {
      "Microsoft.Hosting.Lifetime": "Trace",
      "Microsoft.AspNetCore.Authentication.JwtBearer": "Debug",
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  }
}

重启项目后重新发起请求,控制台会输出具体的验证失败原因(如签名无效、签发者不匹配等),精准定位问题。

5. 简化授权属性测试

将RoleCRUDController上的授权属性简化为:

[Authorize]
// 替代原有的[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

因为已在Program.cs中设置默认认证方案为JWT,简化后可排除认证方案指定的潜在问题。

6. 确认中间件顺序正确性

当前Program.cs中的中间件顺序是正确的,需确保以下顺序不颠倒:

app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthentication(); // 必须在UseAuthorization之前执行
app.UseAuthorization();
app.MapControllers();

7. 验证令牌生成逻辑

在AuthService.cs的AuthenticateAsync方法中,确认user.Role.Name不为空,虽然当前控制器仅要求身份验证而非角色授权,但空角色声明可能导致后续授权逻辑异常,需确保关联角色数据正常。

内容的提问来源于stack exchange,提问作者oleg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 13:52:22