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

ASP.NET Core中JWT Bearer令牌无效导致401未授权问题排查

问题描述

通过登录端点成功生成JWT令牌,但访问需要授权的端点时始终收到401 Unauthorized错误。已用Postman验证请求头中正确携带了访问令牌,但问题仍未解决。以下是相关配置代码,请求排查问题原因:

Program.cs 代码

builder.Services.AddCors(options =>
{
    options.AddPolicy("MyAllowSpecificOrigins",
        builder =>
        {
            builder.WithOrigins("http://localhost:4200")
                   .AllowAnyHeader()
                   .AllowAnyMethod();
        });
});

builder.Services
       .AddIdentityApiEndpoints<PessoaComAcesso>()
       .AddEntityFrameworkStores<ListaDeTarefasContext>();

builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = 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:Issuer"],
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
    };
});

builder.Services.AddAuthorization();

builder.Services.AddHealthChecks();

c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
    In = ParameterLocation.Header,
    Description = "Por favor insira o token JWT com o prefixo 'Bearer '",
    Name = "Authorization",
    Type = SecuritySchemeType.ApiKey,
    BearerFormat = "JWT",
    Scheme = "Bearer"
});

c.AddSecurityRequirement(new OpenApiSecurityRequirement {
    {
        new OpenApiSecurityScheme
        {
            Reference = new OpenApiReference
            {
                Type = ReferenceType.SecurityScheme,
                Id = "Bearer"
            }
        },
        new string[] { }
    }});
});

app.UseCors("MyAllowSpecificOrigins");app.UseAuthentication();
app.UseAuthorization();

授权端点分组代码

var groupBuilder = app.MapGroup("tarefas").RequireAuthorization().WithTags("Tarefas");

appsettings.json 配置

"Jwt": {
    "Issuer": "https://localhost:7086",
    "Key": "my-key"
}
可能的问题原因及排查点
  • IdentityApiEndpoints与自定义JWT认证冲突:AddIdentityApiEndpoints会自动添加一套基于Identity的Bearer认证方案,可能覆盖你配置的默认JWT认证。可尝试在AddIdentityApiEndpoints后明确指定默认认证方案,或检查是否需要同时保留两种认证机制。
  • 令牌生成参数不匹配:检查生成JWT时使用的Issuer、Key、Audience是否与验证参数完全一致。比如生成令牌时是否将Audience设为和Issuer相同的值(你的验证配置中ValidAudience等于ValidIssuer),签名密钥是否完全匹配。
  • 中间件顺序或写法问题:代码中app.UseCors("MyAllowSpecificOrigins");app.UseAuthentication();连写在一起,虽语法没问题,但建议分开换行确保可读性。同时要确认UseAuthentication()和UseAuthorization()是在映射端点(如app.MapControllers()或你的MapGroup)之前调用的,否则中间件不会生效。
  • 权限声明缺失:如果端点的授权策略需要特定Claim(如角色、权限),但生成的JWT中没有对应声明,也会导致401错误。可通过jwt.io解码令牌,检查其中的Claim是否符合要求。
  • 令牌格式问题:确认请求头中Authorization的格式是Bearer {token},注意Bearer后有空格,且令牌无多余空格或换行。
  • 密钥强度不足:你的JWT密钥my-key属于弱密钥,部分环境下可能被验证拒绝。建议使用更长、更复杂的密钥(至少16位以上的随机字符串)。

内容的提问来源于stack exchange,提问作者Gabriel Rodrigues Vieira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 01:34:52