Создание заявок для проекта Blazor WebAssembly

Я использую шаблон Blazor WebAssembly по умолчанию для создания проекта с использованием «опции индивидуальных учетных записей», и я пытаюсь создать настраиваемое утверждение, когда пользователь входит в систему и получает доступ к нему со стороны клиента Blazor, но мне не удалось заставить его работать.

Я знаю, что мне придется создать настраиваемого поставщика состояний аутентификации для клиентского проекта Blazor, но после нескольких часов попыток заставить его работать, я не нашел решения своей проблемы.

Может кто-нибудь дать мне несколько советов, как это реализовать?


person pitaridis    schedule 05.11.2020    source источник


Ответы (1)


In Program.cs

builder.Services.AddApiAuthorization()
    .AddAccountClaimsPrincipalFactory<CustomAccountClaimsPrincipalFactory>();

CustomAccountClaimsPrincipalFactory.cs

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" />

Рабочая демонстрация

person Brian Parker    schedule 06.11.2020
comment
Большое спасибо, Брайан. Я придерживался совершенно неправильного подхода. Вы мне очень помогли своим примером. Еще раз спасибо. - person pitaridis; 06.11.2020
comment
Еще один вопрос, если знаете. Может ли эта функция быть реализована на сервере? Можем ли мы определить заявки на сервере во время входа в систему? - person pitaridis; 06.11.2020