<AuthorizeView Roles="@RulesAndRoles.Rules.FirstOrDefault(xd=> xd.Id ==1).Roles.ToString()">
<IconNavLink Href="Management" Icon="fa-star">
@localizer["Management"]
</IconNavLink>
</AuthorizeView>
<AuthorizeView Roles="@RulesAndRoles.Rules.FirstOrDefault(xd=> xd.Id == 2).Roles.ToString()">
<IconNavLink Href="Entity" Icon="fa-star">
@localizer["Entity"]
</IconNavLink>
</AuthorizeView>
我的 JWT 令牌的角色声明结构如下。
“http://schemas.microsoft.com/ws/2008/06/identity/claims/role”:[ “行政人员”, “用户” ],
我正在从数据库中提取的静态类 RulesAndRoles 中获取并填充必要的角色,系统没有问题。然而,情况发生了变化,现在每个用户可以拥有多个角色。
在上面的代码中,@RulesAndRoles.Rules.FirstOrDefault(xd => xd.Id == 1).Roles.ToString()返回一个类似“Administrator,Manager”的值。如果用户只有“管理员”或“经理”作为其角色,则一切正常,但如果他们同时拥有这两个角色,则任何 AuthorizeView 都无法正常工作。
如何解决这个问题?
提前谢谢您!
<AuthorizeView Roles="Administrator">
<Authorized>
<p>test admin</p>
</Authorized>
<NotAuthorized>
<AuthorizeView Roles="User">
<Authorized>
<p>test user</p>
</Authorized>
<NotAuthorized>
<p>xd</p>
</NotAuthorized>
</AuthorizeView>
</NotAuthorized>
</AuthorizeView>
我尝试过这个,它有效,但不是很干净。在更复杂的领域,它会让事情变得更加复杂。
您可以在 AuthenticationStateProvider 中分离 jwt 角色,如下所示:
public class CustomAuthenticationStateProvider : AuthenticationStateProvider
{
private readonly IAccessTokenProvider _tokenProvider;
public CustomAuthenticationStateProvider(IAccessTokenProvider tokenProvider)
{
_tokenProvider = tokenProvider;
}
public override async Task<AuthenticationState> GetAuthenticationStateAsync()
{
var tokenResult = await _tokenProvider.RequestAccessToken();
if (tokenResult.TryGetToken(out var accessToken))
{
var handler = new JwtSecurityTokenHandler();
var jwtToken = handler.ReadJwtToken(accessToken.Value);
var identity = new ClaimsIdentity(jwtToken.Claims, "Bearer");
// Extract and normalize role claims
var roleClaims = jwtToken.Claims
.Where(c => c.Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/role")
.SelectMany(c => c.Value.Split(','))
.Select(role => new Claim(ClaimTypes.Role, role.Trim()));
identity.AddClaims(roleClaims);
var user = new ClaimsPrincipal(identity);
return new AuthenticationState(user);
}
return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity()));
}
}