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

ASP.NET Core JwtBearer身份验证失效:调用API返回401错误求助

排查ASP.NET Core JwtBearer 401未授权问题的几个关键方向

我之前也踩过一模一样的JWT认证401坑!结合你的控制器代码和日常踩坑经验,给你列几个最可能的排查点:

1. 确认JWT认证服务是否正确注册

首先得检查你的Program.cs(或Startup.cs)里有没有正确配置JwtBearer服务,并且把认证、授权中间件加对顺序——这是最容易漏掉的基础问题:

// 注册JWT认证服务
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            // 这些参数要和你生成Token时用的完全一致,差一个字符都不行
            ValidIssuer = builder.Configuration["Jwt:Issuer"],
            ValidAudience = builder.Configuration["Jwt:Audience"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
        };
    });

// 重点!中间件顺序不能乱:Authentication必须在Authorization前面
app.UseAuthentication();
app.UseAuthorization();

如果少了UseAuthentication(),服务器根本不会去解析请求头里的Token,直接返回401。

2. 检查Token里是否包含正确的Role Claim

你的接口用了[Authorize(Roles = "Admin")],这意味着生成Token时必须把Admin角色加到Claim里,而且要用标准的Role Claim类型:

// 生成Token时的Claim示例
var claims = new List<Claim>
{
    new Claim(JwtRegisteredClaimNames.Sub, "admin_user"),
    // 必须用ClaimTypes.Role,别自定义键名,否则默认的Role授权逻辑识别不到
    new Claim(ClaimTypes.Role, "Admin")
};

var token = new JwtSecurityToken(
    issuer: builder.Configuration["Jwt:Issuer"],
    audience: builder.Configuration["Jwt:Audience"],
    claims: claims,
    expires: DateTime.Now.AddHours(1),
    signingCredentials: new SigningCredentials(
        new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"])),
        SecurityAlgorithms.HmacSha256)
);

如果你的Role Claim用了自定义键(比如直接写"role"),授权逻辑会认不出这个角色,直接返回401。

3. 验证请求头的格式是否正确

发送请求时,Authorization头的格式必须严格是:Bearer <你的Token字符串>,注意两个关键点:

  • 必须有Bearer前缀,后面跟一个空格
  • Token不能有多余的空格或换行

正确的请求头示例:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

很多人容易漏写Bearer或者少了空格,这会导致服务器无法解析Token,直接返回401。

4. 检查Token的有效性和签名

可以用JWT解析工具把你的Token贴进去,重点检查这几项:

  • exp字段:是否已经过期
  • iss和aud:是否和你配置文件里的Issuer、Audience完全一致
  • 签名是否验证通过:确保生成Token用的密钥和认证配置里的IssuerSigningKey完全相同,哪怕多一个空格都会导致签名验证失败

5. 控制器的Authorize配置冲突?

你的控制器上已经加了[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)],方法上又加了[Authorize(Roles = "Admin")]。虽然方法上的Authorize会继承控制器的Scheme配置,但如果你的项目里还有其他认证Scheme(比如Cookie),可能会导致冲突。可以试试在方法上明确指定Scheme:

[HttpPost]
[Authorize(Roles = "Admin", AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[Route("/api/rooms/add")]
public async Task<IActionResult> AddRoom(...)

先从这几个方向排查,大部分JWT 401的问题都出在这些地方!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:02:49