Blazor Web App授权疑问:单角色获取却显示双角色授权视图
问题原因与解决方案
你的问题核心在于对PersistingRevalidatingAuthenticationStateProvider中代码作用的误解:
- 你用
principal.FindFirst(options.ClaimsIdentity.RoleClaimType)?.Value只是获取了第一个角色声明的值,但并没有修改ClaimsPrincipal对象本身包含的角色声明集合。用户实际的ClaimsPrincipal里仍然保留了两个角色的声明信息。 - Blazor的
AuthorizeView组件在做角色验证时,会遍历ClaimsPrincipal中所有的角色声明,只要匹配到对应角色就会显示内容。所以即便你只取了第一个角色值,用户的身份凭证里还是有两个角色,两个AuthorizeView都会触发显示。
解决方法
如果你希望用户只拥有一个角色(比如只保留第一个),需要在PersistingRevalidatingAuthenticationStateProvider中修改ClaimsPrincipal,移除多余的角色声明:
// 在处理ClaimsIdentity的逻辑中 var existingRoles = principal.Claims.Where(c => c.Type == options.ClaimsIdentity.RoleClaimType).ToList(); // 只保留第一个角色,移除其他 foreach (var roleClaim in existingRoles.Skip(1)) { ((ClaimsIdentity)principal.Identity).RemoveClaim(roleClaim); }
这样处理后,ClaimsPrincipal里就只有一个角色声明,AuthorizeView只会匹配对应的那个组件。
内容的提问来源于stack exchange,提问作者Francisco Fernandes
相关产品推荐
相关产品推荐

