Авторизованный просмотр Blazor WebAssembly с ролями

#authentication #authorization #blazor #blazor-webassembly

#аутентификация #авторизация #blazor #blazor-webassembly

Вопрос:

У меня есть страница blazor, на которой должна отображаться кнопка, если пользователь находится в роли GRP_FAST_ADMIN. В целях тестирования, если они не входят в роль, я распечатываю список ролей, в которых они находятся. Проблема в том, что их утверждения показывают, что у них правильная роль, но они все еще не авторизованы.

 @page "/RestartApplication"


<AuthorizeView Roles="GRP_FAST_ADMIN">
    <Authorized>
        <button class="btn-default" @onclick="() => ViewModel.RestartApplication()">Restart Application</button>
    </Authorized>
    <NotAuthorized>
        @if(Claims !=null)
        {
            @foreach(var claim in Claims)
            {
                <p>@(claim.Type.ToString()   ": "   claim.Value.ToString())</p>
            }
        }
    </NotAuthorized>
</AuthorizeView>

  

Вывод из раздела:

 http://schemas.microsoft.com/ws/2008/06/identity/claims/role: CM_GENERAL_USER

http://schemas.microsoft.com/ws/2008/06/identity/claims/role: ES_GENERAL_USER

http://schemas.microsoft.com/ws/2008/06/identity/claims/role: GRP-PEOPLESOFT-P-GL_GENERAL

http://schemas.microsoft.com/ws/2008/06/identity/claims/role: GRP_AWB_ADMIN

http://schemas.microsoft.com/ws/2008/06/identity/claims/role: GRP_FAST_ADMIN

http://schemas.microsoft.com/ws/2008/06/identity/claims/role: GRP_ILG_RO

http://schemas.microsoft.com/ws/2008/06/identity/claims/role: IB_PWR_USER

http://schemas.microsoft.com/ws/2008/06/identity/claims/role: IBP_POWER_USER

http://schemas.microsoft.com/ws/2008/06/identity/claims/role: MP_ADMIN_GRP

http://schemas.microsoft.com/ws/2008/06/identity/claims/role: OFB_GENERAL_USER

http://schemas.microsoft.com/ws/2008/06/identity/claims/role: PK_GENERAL_USER

http://schemas.microsoft.com/ws/2008/06/identity/claims/role: PT_GENERAL_USER

http://schemas.microsoft.com/ws/2008/06/identity/claims/role: PT_PWR_USER

http://schemas.microsoft.com/ws/2008/06/identity/claims/role: RESORT_OPS_UTILITY
  

Базовая аутентификация работает. Я могу успешно использовать только для того, чтобы убедиться, что кто-то вошел в систему. Авторизация настраивается при запуске WebAssembly с помощью этого:

  public static IServiceCollection AddPowerToolsWebServices(this IServiceCollection services)
        {
            services.AddDevExpressBlazor();
            services.AddBlazoredLocalStorage();
            services.AddAuthorizationCore();
            services.AddScoped<TokenAuthenticationStateProvider>();
            services.AddScoped<AuthenticationStateProvider, TokenAuthenticationStateProvider>(provider =>
            provider.GetRequiredService<TokenAuthenticationStateProvider>());
            return services;
        }
  

Я обрабатываю переопределение для GetAuthenticationStateAsync()

  public override async Task<AuthenticationState> GetAuthenticationStateAsync()
        {
            var token = await GetTokenAsync();
            if (string.IsNullOrWhiteSpace(token))
                return _Anonymous;

            _HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", token);
            return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity(ParseClaimsFromJwt(token), "jwt")));
        }
  

Это анализирует все утверждения и получает каждую роль и добавляет их по отдельности в качестве утверждения. Не уверен, чего мне не хватает.

Ответ №1:

Похоже, вам придется преобразовать утверждения о роли с AccountClaimsPrincipalFactory помощью .

Тип утверждения, который ожидает Blazor, — это просто «роль», а не «http://schemas.microsoft.com/ws/2008/06/identity/claims/role «. Фабрика может добиться этого за вас, тогда вы сможете использовать стандартные компоненты / механизмы blazor для управления ими.

Даже с опцией «Отдельные учетные записи пользователей» вы должны это сделать, поскольку утверждения представлены в виде строки, разделенной запятыми.

Это ссылка для примера. Это не ваш случай, но решение такое же, вам нужно преобразовать имеющиеся у вас утверждения в то, что ожидает blazor.

Комментарии:

1. 0 для других людей, прибывающих сюда с помощью веб-поиска, этот ответ указывает вам правильное направление. Azure AD добавляет массив ролей к вашему токену и имеет роли. тип утверждения, который использует blazor («роль» или » schemas.microsoft.com/ws/2008/06/identity/claims/role » ) можно настроить в настройках.