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
相关产品推荐
相关产品推荐

