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

为何Postman中使用JWT Bearer始终返回Unauthorized?

问题:Postman使用Bearer认证返回Unauthorized(Token正确)

我在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();

请问我是否遗漏了什么配置?


排查与解决方案

从代码和问题场景来看,可从以下几个方向逐一排查:

  1. 检查中间件注册顺序与端点位置
    确保端点路由(如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();
    
  2. 验证Token生成密钥与配置一致
    确认生成Token时使用的密钥和SymmetricSecurityKey中传入的字符串完全匹配(包括大小写、特殊字符、空格),密钥不匹配会直接导致验证失败。

  3. 检查Token格式与有效性

    • Postman中需严格遵循Bearer <token>格式,注意Bearer后必须有一个空格,不能有多余的换行或空格;
    • 用JWT解析工具查看Token的exp字段,确认Token未过期。
  4. 确认控制器/Action添加授权特性
    确保需要认证的控制器或Action上添加了[Authorize]特性,否则授权逻辑不会触发:

    [ApiController]
    [Route("api/[controller]")]
    [Authorize]
    public class TestController : ControllerBase
    {
        [HttpGet]
        public IActionResult Get()
        {
            return Ok("Authorized");
        }
    }
    
  5. 添加日志排查验证失败原因
    在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 15:01:02