Asp.net Core携带Bearer Token访问受保护接口返回401未授权问题
碰到这种401授权失败的问题确实头疼,我帮你梳理几个最常见的排查方向,你可以逐一核对:
一、先确认Token生成的核心配置
- 检查你生成Token时是否正确指定了有效签名密钥(SigningKey),ASP.NET Core的JWT验证要求生成和验证环节使用完全一致的密钥,比如用
SymmetricSecurityKey时,两边的字节数组编码方式(UTF8/ASCII)必须统一,不能出现差异。 - 确认Token的**受众(Audience)和颁发者(Issuer)**是否匹配,生成Token时设置的
Audience和Issuer,必须和验证配置(Program.cs/Startup.cs)里的完全一致,否则验证会直接失败。 - 用jwt.io解析你生成的Token,检查**过期时间(Expires)**是否已经失效,这是很容易忽略的小问题。
二、验证授权中间件的配置是否正确
- 确保已在Program.cs/Startup.cs中正确添加JWT验证服务,示例代码如下:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = "你的颁发者标识", ValidAudience = "你的受众标识", IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("你的签名密钥")) }; }); - 注意中间件的顺序:必须先添加
app.UseAuthentication();,再添加app.UseAuthorization();,如果顺序搞反,授权逻辑会在Token验证前执行,直接返回401。
三、Postman请求头的格式是否合规
结合你提到的请求头截图,重点核对这几点:
- 确保请求头的键是
Authorization,值的格式是Bearer 你的Token内容,Bearer后面必须有一个空格,很多人会漏掉这个空格导致验证失败。 - 确认你粘贴的是纯Token字符串,不要包含响应JSON里的其他字段(比如
"access_token": "xxx"里的引号和键名)。 - 检查是否有代理或网关修改了请求头,导致
Authorization字段被覆盖或丢失。
四、额外排查点
- 如果API部署在IIS上,需要禁用IIS的非匿名身份验证(比如Windows身份验证),否则IIS会优先处理自身的验证逻辑,导致ASP.NET Core的JWT验证不生效。
- 检查
[Authorize]特性是否指定了正确的验证方案,如果你的验证方案不是默认的JwtBearerDefaults.AuthenticationScheme,需要显式指定:[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] - 添加验证日志排查具体错误,在JwtBearer配置中加入事件监听:
这样能直接看到是签名错误、受众不匹配还是过期等具体问题。options.Events = new JwtBearerEvents { OnAuthenticationFailed = context => { Console.WriteLine("Token验证失败原因:" + context.Exception.Message); return Task.CompletedTask; } };
内容的提问来源于stack exchange,提问作者OrcusZ
相关产品推荐
相关产品推荐

