Blazor WASM项目已分配用户角色无法识别的问题如何解决?
解决方案
核心原因
Blazor WASM搭配IdentityServer实现认证时,默认不会将用户的角色(role)声明写入签发的令牌中,因此授权校验时无法读取到用户的Admin角色信息,导致访问被拒绝。
具体修复步骤
配置IdentityServer输出角色声明
修改Startup.cs中AddIdentityServer配置,指定将角色声明加入到身份资源和API资源的返回声明中:
services.AddIdentityServer() .AddApiAuthorization<ApplicationUser, ApplicationDbContext>(options => { // 给openid身份资源添加role声明,写入ID令牌 options.IdentityResources["openid"].UserClaims.Add("role"); // 给API资源添加role声明,写入访问令牌 options.ApiResources.Single().UserClaims.Add("role"); });
配置JWT认证的角色声明映射
ASP.NET Core默认使用ClaimTypes.Role(值为http://schemas.microsoft.com/ws/2008/06/identity/claims/role)作为角色校验的声明类型,而JWT令牌中的角色声明为role,需要手动指定映射关系:
services.AddAuthentication() .AddIdentityServerJwt() .AddJwtBearer(options => { options.TokenValidationParameters.RoleClaimType = "role"; });
同步调整Identity声明配置(可选,避免声明类型不匹配)
修改Startup.cs中已有的IdentityOptions配置,补充角色声明类型的指定:
services.Configure<IdentityOptions>(options => { options.ClaimsIdentity.UserIdClaimType = ClaimTypes.NameIdentifier; options.ClaimsIdentity.RoleClaimType = "role"; });
客户端侧配置(如果使用Blazor WASM前端授权)
如果你的[Authorize]特性加在Blazor WASM客户端页面而非服务端Razor页面,还需要修改客户端项目的Program.cs,指定客户端从令牌中读取role作为角色声明:
builder.Services.AddApiAuthorization() .AddAccountClaimsPrincipalFactory<AccountClaimsPrincipalFactory<RemoteUserAccount>>( options => { options.UserOptions.RoleClaim = "role"; });
生效验证
所有配置完成后,注销当前已登录的账号,重新登录获取新的令牌即可生效。你可以通过浏览器开发者工具解码JWT令牌,确认令牌中已包含role: Admin字段,即可确认配置正确。
内容的提问来源于stack exchange,提问作者Krellex
相关产品推荐
相关产品推荐

