持有有效JWT Token仍返回401 Unauthorized的原因排查
问题原因及解决方案
1. 密钥处理逻辑不一致(核心问题)
生成Token和验证Token时,对密钥的处理方式完全不同,导致签名验证失败:
- Token生成代码中:配置的
Jwt:Secret是Base64编码字符串,通过Convert.FromBase64String(base64Key)转成字节数组作为密钥 - 验证配置中:直接用
Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Secret"])把配置值当作普通UTF8字符串转字节,这和生成时的密钥完全不匹配,JWT签名验证不通过,自然返回401。
修复方法:
把program.cs里的密钥解析逻辑改成和生成时一致:
IssuerSigningKey = new SymmetricSecurityKey( Convert.FromBase64String(builder.Configuration["Jwt:Secret"]) ),
2. 中间件顺序错误(常见坑)
检查program.cs中的中间件注册顺序,必须保证:
app.UseAuthentication(); // 先执行身份验证 app.UseAuthorization(); // 再执行授权逻辑
而且这两个中间件要放在app.UseRouting()之后、app.MapControllers()之前,否则身份验证流程不会被正确触发。
3. 接口冗余代码提示
添加[Authorize]特性后,ASP.NET Core框架已经自动完成Token的验证、解析和用户身份注入,不需要手动从请求头提取Token解析。你可以直接通过User.Claims获取用户信息,比如:
var userId = User.FindFirstValue("UserId"); var email = User.FindFirstValue(ClaimTypes.Name);
接口里手动解析Token的代码可以完全删除,既简化逻辑又避免冗余。
内容的提问来源于stack exchange,提问作者Angelina
相关产品推荐
相关产品推荐

