ASP.NET Core 7 Web API JWT授权失败排查求助
在ASP.NET Core 7 Web API中,仅给特定端点添加[Authorize]特性后,请求时返回错误:
authorization failed. These requirements were not met: DenyAnonymousAuthorizationRequirement: Requires an authenticated user
已尝试Swagger携带令牌、外部应用手动添加Authorization头(Bearer 令牌)但问题仍存在,可从以下方向排查:
验证中间件顺序与自定义中间件干扰
当前Startup中UseAuthentication()、UseRouting()、UseAuthorization()的顺序是正确的,但需排查自定义中间件(如ErrorHandlerMiddleware)是否在认证流程前拦截请求、修改请求头,可临时注释该中间件测试是否恢复正常。校验JWT令牌的核心参数
用JWT解码工具解析生成的令牌,确认:iss(签发者)、aud(受众)与配置中ValidIssuer、ValidAudience完全一致(大小写敏感)- 令牌
exp字段时间晚于当前时间,未过期 - 签名算法匹配:生成时使用
SecurityAlgorithms.HmacSha256,可在TokenValidationParameters中显式添加ValidAlgorithms = new[] { SecurityAlgorithms.HmacSha256 }强制校验算法 - 生成令牌时读取的
jwtSettings与认证配置中的参数完全一致,无拼写错误
确认Authorization头格式与传递完整性
- 确保请求头为
Authorization: Bearer <token>,Bearer后必须有一个空格,令牌无多余空格或换行 - 若使用反向代理(IIS、Nginx等),需确认代理未修改或移除Authorization头:
- IIS需在
web.config中配置允许传递该头 - Nginx需添加
proxy_set_header Authorization $http_authorization;配置
- IIS需在
- 确保请求头为
启用认证日志查看详细错误
在appsettings.Development.json中添加日志配置:{ "Logging": { "LogLevel": { "Microsoft.AspNetCore.Authentication": "Debug", "Microsoft.AspNetCore.Authorization": "Debug" } } }运行后查看控制台日志,会输出令牌验证失败的具体原因(如签名无效、iss不匹配等)
显式指定认证Scheme
尽管配置了默认认证Scheme,可尝试在[Authorize]特性中显式指定:[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]确保端点使用JWT认证处理请求
验证用户身份标识Claims
生成令牌时仅添加了NameClaim,可尝试补充用户标识Claim:var claims = new List<Claim> { new Claim(JwtRegisteredClaimNames.Name, loginDto.Username), new Claim(ClaimTypes.NameIdentifier, loginDto.Username) };同时可在非授权端点或自定义中间件中检查
User.Identity.IsAuthenticated的值,确认认证流程是否正确执行
内容的提问来源于stack exchange,提问作者schh

