.NET Core WebAPI传递JWT令牌仍返回Unauthorized错误求助
服务端配置排查
- 核对
AddJwtBearer配置与Token生成逻辑的**密钥、颁发者(Issuer)、受众(Audience)**必须完全一致,比如生成Token用new SymmetricSecurityKey(Encoding.UTF8.GetBytes("my-32-char-secret")),认证配置里就得用同一个密钥,差一个字符都不行。 - 检查中间件注册顺序:
UseAuthentication()和UseAuthorization()必须放在UseRouting()之后,UseEndpoints()之前,顺序搞反会导致认证逻辑不触发。 - 确认Token过期时间不要设置过短,比如测试时可以设成1小时,避免请求时Token已经失效。
- 确保需要保护的API接口上添加了
[Authorize]特性,没加的话不会触发认证,但既然返回Unauthorized,大概率是加了,还是确认下。
客户端请求排查
- 严格检查请求头格式:必须是
Authorization: Bearer <你的Token>,重点注意Bearer后面的空格,很多人漏掉这个空格导致认证失败。 - 确认Token完整无修改:复制Token时要从头到尾全选,包括开头的
eyJ和结尾的签名部分,别漏了字符。 - 跨域场景下,要确保服务端CORS配置允许携带
Authorization头,比如在CORS配置里加AllowAnyHeader(),或者明确指定允许该头。
Payload与验证规则排查
- 生成Token时要包含必要的Claims,比如
NameIdentifier、Name这类常用字段,部分默认认证逻辑依赖这些Claims,缺失可能导致认证不通过。 - 检查
TokenValidationParameters的配置:ValidateIssuerSigningKey必须设为true;如果开启了ValidateIssuer或ValidateAudience,必须和生成Token时的Issuer、Audience完全匹配,否则会验证失败。
快速排查技巧
- 开启认证调试日志:在
appsettings.json里添加如下配置,查看详细的认证失败原因:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore.Authentication": "Debug" } } }
- 服务端本地验证Token:在生成Token的代码后面加一段验证逻辑,直接排查Token本身是否有效:
var tokenHandler = new JwtSecurityTokenHandler(); var validationParams = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("你的密钥")), ValidateIssuer = true, ValidIssuer = "你的颁发者", ValidateAudience = true, ValidAudience = "你的受众", ValidateLifetime = true }; try { tokenHandler.ValidateToken(生成的Token, validationParams, out _); // 走到这说明Token本身没问题,问题出在请求传递或中间件配置 } catch (Exception ex) { // 打印ex.Message,直接看到验证失败的具体原因,比如密钥不匹配、过期等 }
内容的提问来源于stack exchange,提问作者user1531912
相关产品推荐
相关产品推荐

