ASP.NET Core中JWT授权异常:请求返回403 Forbidden排查求助
问题原因及解决方案
核心问题:JWT角色声明的类型不匹配
ASP.NET Core默认会把JWT payload中的role声明,自动映射到标准Claim类型http://schemas.microsoft.com/ws/2008/06/identity/claims/role(对应ClaimTypes.Role枚举值),而你的授权策略里直接要求type=role的声明,两者不匹配,导致授权失败返回403。
两种解决办法:
办法一:修改授权策略,使用标准角色Claim类型
在Program.cs的授权配置中,引用System.Security.Claims命名空间,然后将策略改为检查标准角色类型:
using System.Security.Claims; builder.Services.AddAuthorization(options => options.AddPolicy("admin", policy => policy.RequireClaim(ClaimTypes.Role, "admin")));
办法二:修改JWT验证配置,保留原role声明类型
如果希望保持JWT中的role声明类型不变,需要在配置JWT认证时,指定角色声明的类型为role:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { // 补充你的其他验证参数(如ValidIssuer、ValidAudience、IssuerSigningKey等) RoleClaimType = "role" // 告诉框架直接使用JWT中的"role"作为角色声明类型 }; });
额外检查点
确保app.UseAuthentication();中间件在app.UseAuthorization();之前注册,认证是授权的前提,顺序错误也会导致授权失败。
内容的提问来源于stack exchange,提问作者Kacper Wyczawski
相关产品推荐
相关产品推荐

