ASP.NET Core JWT授权校验时自定义Claims全部为空问题求助
问题排查及修复方案
1. 受众校验配置不匹配
这是最核心的错误:
- 生成JWT令牌时,传入的受众参数为
_config["Jwt:audience"] - 校验参数中
ValidAudience错误配置为Configuration["Jwt:Issuer"],和生成时的受众值不一致,导致JWT校验直接失败,身份信息未被解析,所以Claims全部为空
修复方案:将Startup中JWT配置的ValidAudience改为对应配置项:
ValidAudience = Configuration["Jwt:audience"],
2. 中间件执行顺序错误
如果你的Configure方法中没有按照正确顺序注册中间件,也会导致身份未提前解析:
必须保证UseAuthentication在UseAuthorization之前执行,示例正确顺序:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 其他中间件比如Cors、异常处理等放在前面 app.UseCors("CorsPolicy"); app.UseRouting(); // 先执行身份认证 app.UseAuthentication(); // 再执行授权校验 app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
3. 接口未添加授权特性
如果要访问的接口没有加[Authorize]特性,框架不会自动解析JWT令牌填充context.User,也会出现Claims为空的情况,确保需要校验的接口添加对应特性:
[Authorize] [ApiController] [Route("api/[controller]")] public class YourController : ControllerBase { // 接口实现 }
可选优化
可以在TokenValidationParameters中添加时钟偏移配置,避免服务器时间差导致的有效期校验误判:
ClockSkew = TimeSpan.Zero,
内容的提问来源于stack exchange,提问作者Prabhakar
相关产品推荐
相关产品推荐

