.NET 7 Minimal Web API Bearer认证返回401未授权问题求助
.NET 7 Minimal API JWT认证401未授权问题排查与修复
问题描述
使用.NET 7开发Minimal Web API并集成Bearer Token认证,登录接口可正常生成JWT Token,但携带该Token访问受保护的/weatherforecast接口时,始终返回HTTP 401「未授权」错误。已尝试更换加密算法为HmacSha256、验证密钥有效性,在Swagger和Postman中测试均出现相同问题。
代码中的关键错误及修复方案
1. 中间件顺序颠倒
认证与授权中间件的执行顺序错误,必须先完成认证再执行授权逻辑。当前代码中app.UseAuthorization()在app.UseAuthentication()之前,导致授权流程无法获取到认证后的用户身份,直接返回401。
修复代码:
调整中间件调用顺序:
app.UseHttpsRedirection(); // 先执行认证,再执行授权 app.UseAuthentication(); app.UseAuthorization();
2. Swagger安全定义ID不匹配
Swagger配置中,AddSecurityDefinition使用的ID是"Beaver",但AddSecurityRequirement中引用的ID是"Bearer",两者不匹配会导致Swagger的授权功能无法正确关联Token(虽不是Postman报错的核心原因,但会影响Swagger使用体验)。
修复代码:
将AddSecurityDefinition的ID改为"Bearer",与授权要求中的引用保持一致:
builder.Services.AddSwaggerGen(options => { options.SwaggerDoc("v1", info); // 修正ID为"Bearer" options.AddSecurityDefinition("Bearer", securityScheme); options.AddSecurityRequirement(securityReq); });
3. 额外建议(非当前401原因,但需注意)
当前代码中TokenValidationParameters的ValidateLifetime设置为false,建议开发环境也保持true,避免因Token过期逻辑失效导致后续排查问题时混淆,生产环境必须设置为true保障安全性。
验证修复效果
- 调整中间件顺序并修正Swagger配置后,重启API。
- 调用
login接口获取Token。 - 在Swagger中点击「Authorize」按钮,输入
Bearer {Token}格式内容,或在Postman请求头中添加Authorization: Bearer {Token}。 - 访问
/weatherforecast接口,此时应能正常返回数据,不再出现401错误。
内容的提问来源于stack exchange,提问作者Nikolaos Psaltakis
相关产品推荐
相关产品推荐

