Не удается заставить работать роли приложения Blazor WASM AAD - PullRequest
0 голосов
/ 09 июля 2020

Итак, я начал со следующих документов Microsoft:

Защитите ASP. NET приложение Core Blazor WebAssembly с помощью Azure Active Directory

Azure Группы AD, административные роли и определяемые пользователем роли

Похоже, что со стороны Azure все отлично:

Это отлично работает:

@page "/clients"
@inject NavigationManager navigationManager
@inject HttpClient Http
@inject AppData appData
@inject AuthenticationStateProvider AuthenticationStateProvider
@attribute [Authorize]

Я распечатал претензии, чтобы узнать, что происходит:

protected async override Task OnInitializedAsync()
{
    var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
    var user = authState.User;

    foreach (var claim in user.Claims)
    {
            System.Diagnostics.Debug.WriteLine(claim.Type + ":" + claim.ValueType + ":" + claim.Value);
    }
}

Это одна из напечатанных строк:

roles:http://www.w3.org/2001/XMLSchema#string:["Admin"]

Итак, я вижу, что приложение, которое я добавил в манифест приложения на Azure, попало сюда. (GUID скрыты ниже для конфиденциальности)

"appRoles": [
        {
            "allowedMemberTypes": [
                "User"
            ],
            "description": "Can view everything.",
            "displayName": "Global Viewer",
            "id": "IDGOESHERE",
            "isEnabled": true,
            "lang": null,
            "origin": "Application",
            "value": "GlobalViewer"
        },
        {
            "allowedMemberTypes": [
                "User"
            ],
            "description": "Admins can access restricted areas.",
            "displayName": "Admin",
            "id": "IDGOESHERE",
            "isEnabled": true,
            "lang": null,
            "origin": "Application",
            "value": "Admin"
        }
    ],

Также мой пользователь был добавлен в роль администратора в корпоративных приложениях.

Однако добавление роли в директиве атрибута [Authorize] приводит к потере доступа к странице : (У вас нет прав доступа к этому ресурсу.)

attribute [Authorize(Roles = "Admin")]

Это находится в Program.cs (у меня есть актуальные GUID в "GUIDGOESHERE")

builder.Services.AddMsalAuthentication(options =>
{
    builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication);
    options.ProviderOptions.DefaultAccessTokenScopes.Add("GUIDGOESHERE/EmployeesAccess");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("GUIDGOESHERE/AdminAccess");
    options.UserOptions.RoleClaim = "roles";
});

Проблема может быть в в мою роль претендую. Может быть, проблема в том, что это утверждение выглядит как массив? Если да, то как мне это исправить?

1 Ответ

1 голос
/ 16 августа 2020

Оказывается, Azure может немного опережать ASP. NET Core

Шаблон аутентификации по умолчанию Azure AD не работает из коробки, его нужно немного настроить .

Следуйте инструкциям в документации MS здесь: Azure Группы AD, административные роли и определяемые пользователем роли

Короче говоря:

  • Из коробки работает с одиночной ролью. например, «Admin»
  • Проблема в нескольких ролях.
  • Утверждение «роли» поступает в виде строки «[Admin, User]», которая не соответствует «Admin» или «User»
  • Класс CustomUserAccount разбивает роли на объект string [], который решает проблему.
  • Microsoft хорошо поработала над документированием обходного пути. (ссылка выше)
...