为何Postman中使用JWT Bearer始终返回Unauthorized?
我在Postman中尝试使用Bearer认证,持有正确的Token,但始终返回Unauthorized。
我的Program.cs代码如下:
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("shh...this is a secret!")); builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(opt =>{ opt.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, ValidateIssuer = false, ValidateAudience = false, IssuerSigningKey = key }; }); app.UseCors(m => m.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()); app.UseAuthentication(); app.UseAuthorization();
请问我是否遗漏了什么配置?
排查与解决方案
从代码和问题场景来看,可从以下几个方向逐一排查:
检查中间件注册顺序与端点位置
确保端点路由(如app.MapControllers()、app.MapGet/Post等)必须放在UseAuthentication和UseAuthorization之后,否则认证逻辑不会对路由生效。正确的完整流程示例:var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("shh...this is a secret!")); builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(opt =>{ opt.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, ValidateIssuer = false, ValidateAudience = false, IssuerSigningKey = key }; }); builder.Services.AddCors(m => m.AddPolicy("AllowAll", policy => policy.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod())); var app = builder.Build(); // 中间件顺序固定:CORS → 认证 → 授权 → 路由 app.UseCors("AllowAll"); app.UseAuthentication(); app.UseAuthorization(); // 端点路由必须放在最后 app.MapControllers(); app.Run();验证Token生成密钥与配置一致
确认生成Token时使用的密钥和SymmetricSecurityKey中传入的字符串完全匹配(包括大小写、特殊字符、空格),密钥不匹配会直接导致验证失败。检查Token格式与有效性
- Postman中需严格遵循
Bearer <token>格式,注意Bearer后必须有一个空格,不能有多余的换行或空格; - 用JWT解析工具查看Token的
exp字段,确认Token未过期。
- Postman中需严格遵循
确认控制器/Action添加授权特性
确保需要认证的控制器或Action上添加了[Authorize]特性,否则授权逻辑不会触发:[ApiController] [Route("api/[controller]")] [Authorize] public class TestController : ControllerBase { [HttpGet] public IActionResult Get() { return Ok("Authorized"); } }添加日志排查验证失败原因
在AddJwtBearer中添加事件监听,输出验证失败的具体信息,快速定位问题:.AddJwtBearer(opt =>{ opt.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, ValidateIssuer = false, ValidateAudience = false, IssuerSigningKey = key }; opt.Events = new JwtBearerEvents { OnAuthenticationFailed = context => { Console.WriteLine($"认证失败:{context.Exception.Message}"); return Task.CompletedTask; }, OnTokenValidated = context => { Console.WriteLine("Token验证成功"); return Task.CompletedTask; } }; });运行程序后查看控制台输出,即可获取验证失败的详细原因。
内容的提问来源于stack exchange,提问作者taleen wahdan
相关产品推荐
相关产品推荐

