为Blazor WebAssembly项目创建声明

为Blazor WebAssembly项目创建声明,blazor,blazor-client-side,blazor-webassembly,asp.net-blazor,Blazor,Blazor Client Side,Blazor Webassembly,Asp.net Blazor,我使用默认Blazor WebAssembly模板使用“个人用户帐户选项”创建一个项目,当用户从Blazor客户端登录并访问时,我尝试创建一个自定义声明,但我没有设法使其工作 我知道我必须为Blazor客户机项目创建一个自定义身份验证状态提供程序,但是在尝试使其工作了几个小时之后,我还没有找到解决问题的方法 有人能给我一些如何实现它的提示吗?在Program.cs builder.Services.AddApiAuthorization() .AddAccountClaimsPrinci

我使用默认Blazor WebAssembly模板使用“个人用户帐户选项”创建一个项目,当用户从Blazor客户端登录并访问时,我尝试创建一个自定义声明,但我没有设法使其工作

我知道我必须为Blazor客户机项目创建一个自定义身份验证状态提供程序,但是在尝试使其工作了几个小时之后,我还没有找到解决问题的方法


有人能给我一些如何实现它的提示吗?

Program.cs

builder.Services.AddApiAuthorization()
    .AddAccountClaimsPrincipalFactory<CustomAccountClaimsPrincipalFactory>();
public class CustomAccountClaimsPrincipalFactory
    : AccountClaimsPrincipalFactory<RemoteUserAccount>
{
    private const string Planet = "planet";

    public CustomAccountClaimsPrincipalFactory(IAccessTokenProviderAccessor accessor)
        : base(accessor) { }

    public async override ValueTask<ClaimsPrincipal> CreateUserAsync(
        RemoteUserAccount account,
        RemoteAuthenticationUserOptions options)
    {
        var user = await base.CreateUserAsync(account, options);

        if (user.Identity.IsAuthenticated)
        {
            var identity = (ClaimsIdentity)user.Identity;
            var claims = identity.Claims.Where(a => a.Type == Planet);
            if (!claims.Any())
            {
                identity.AddClaim(new Claim(Planet, "mars"));
            }
        }
        return user;

    }

}


ClaimDisplay.razor

@using System.Linq
@using System.Threading.Tasks
@using Microsoft.AspNetCore.Components
@using Microsoft.AspNetCore.Components.Authorization

@ClaimType: @Claim
@code {
    [Inject]
    AuthenticationStateProvider AuthenticationStateProvider { get; set; }

    [Parameter]
    public string ClaimType { get; set; }

    public string Claim { get; set; }

    protected override async Task OnInitializedAsync()
    {
        var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
        var user = authState.User;
        if (user.Identity.IsAuthenticated)
        {
            var userClaims = user.Claims.Where(claim => claim.Type.Equals(ClaimType));
            Claims = userClaims.Any() ? userClaims.Select(claim => claim.Value).Aggregate(AddClaims) : "";
        }
    }

    private static string AddClaims(string left, string right) => left + ", " + right;
}
用法

<ClaimDisplay ClaimType="planet" />



工作

非常感谢你,布莱恩。我采取了一种完全错误的方法。你的例子帮了我很多。再次感谢。如果你知道的话,还有一个问题。这个功能可以由服务器实现吗?我们可以在登录期间在服务器上定义声明吗?