Blazor应用AuthorizeView无法获取用户角色授权状态如何解决?
问题根源
Blazor WebAssembly + IdentityServer 架构下默认不会将用户角色声明自动包含在下发给前端的令牌中,且前端未指定角色声明的映射规则,所以导致IsInRole始终返回false,按以下步骤修改即可:
1. 服务端(Startup.cs)修改
1.1 配置IdentityServer返回角色声明
修改AddIdentityServer代码块,将角色声明加入令牌返回列表:
services.AddIdentityServer() .AddApiAuthorization<ApplicationUser, ApplicationDbContext>(options => { // 向id_token添加角色声明,供前端权限识别使用 options.IdentityResources["openid"].UserClaims.Add("role"); options.IdentityResources["profile"].UserClaims.Add("role"); // 向access_token添加角色声明,供后端API权限校验使用 options.ApiResources.Single().UserClaims.Add("role"); });
1.2 移除JWT默认声明映射
避免JWT中间件自动把role声明转换为微软旧版Schema名称,导致前端识别失败,在ConfigureServices方法开头添加:
System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Remove("role");
2. 客户端(Program.cs)修改
修改WASM项目的授权配置,指定前端用来识别角色的声明字段:
builder.Services.AddApiAuthorization(options => { options.UserOptions.RoleClaim = "role"; });
验证方法
修改完成后重新运行项目,登录后可在浏览器开发者工具>应用>本地存储中找到当前用户的id_token,复制后用JWT解码工具验证是否存在role字段、值是否为Administrator,确认令牌包含正确角色后AuthorizeView组件和IsInRole方法就会正常生效。
内容的提问来源于stack exchange,提问作者Waller
相关产品推荐
相关产品推荐

