我的 Blazor WebAssembly 项目中客户端具有多个角色的问题

问题描述 投票:0回答:1
<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>

我尝试过这个,它有效,但不是很干净。在更复杂的领域,它会让事情变得更加复杂。

asp.net-core blazor client webassembly
1个回答
0
投票

您可以在 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()));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.