Роли/группы Azure Active Directory и доступ к ним с помощью Blazor WASM AuthorizeView

#authentication #azure-active-directory #blazor #blazor-webassembly

Вопрос:

Эй, вход и выход из системы работают, как и ожидалось.

Я создал роли в регистрации приложения.

введите описание изображения здесь

В манифесте я изменил требования GroupMembership с null на «Все».

 "groupMembershipClaims": "All",
 

Эти роли были назначены мне (Алексу) и 2 созданным группам (скриншот корпоративного приложения).:

введите описание изображения здесь

Programm.cs / Добавлены опции.Варианты использования.Требование роли = «Одобрить»

   builder.Services.AddMsalAuthentication(options =>
    {
        builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication);
        options.ProviderOptions.DefaultAccessTokenScopes
            .Add("https://graph.microsoft.com/User.Read");
        options.ProviderOptions.LoginMode = "redirect";
        options.UserOptions.RoleClaim = "appRole";
    });
    
 

Когда я пытаюсь получить к ним доступ, например, с помощью: Роли=»dog_cc_ma»

 @page "/"
@inject Microsoft.Extensions.Localization.IStringLocalizer<ResourceFiles.Resource> localizer
@attribute [Authorize]

<h1>@localizer["helloworld"]!</h1>

<AuthorizeView>
    <Authorized>
        Hello, @context.User.Identity?.Name! <br />
        @context.User.Identity?.AuthenticationType;
           <ul>
                <li>@foreach (var claim in context.User.Identities)
                {<ul>
                    <li>@claim.RoleClaimType</li>
                    <li>@claim.AuthenticationType</li>
                    <li>@claim.Actor</li>
                    <li>@claim.NameClaimType</li>
                    <li>@claim.Label</li>
                </ul>
                }
                </li>
            </ul> 
    </Authorized>
    <NotAuthorized>
  
    </NotAuthorized>
</AuthorizeView>

<AuthorizeView Roles="admin, superuser, owner">
    <p>You can only see this if you're an admin or superuser.</p>
    Hello, @context.User.Identity?.Name! <br />
</AuthorizeView>
<AuthorizeView Roles="dog_cc_ma">
    <p>You can only see this if you have a dog insurance.</p>
    Hello, @context.User.Identity?.Name! <br />
</AuthorizeView>
<AuthorizeView Roles="travel_cc_ma">
    <p>You can only see this if you have a travel insurance.</p>
    Hello, @context.User.Identity?.Name! <br />
</AuthorizeView>
 

Это не работает, кто-нибудь знает, почему….?

претензия.петля

введите описание изображения здесь

Всего наилучшего, Алекс

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

1. Можете ли вы показать, какие выходные данные поступают из цикла утверждений на вашей странице.

2. Привет, отредактировал вопрос и добавил скриншот, ТАЙ

3. Получил решение, можно установить как решенное. Я отредактирую вопрос, чтобы, возможно, он помог кому-то другому с той же проблемой.

4. Вы можете опубликовать ответ на свой собственный вопрос с указанием решения..

5. Тай, можешь принять его через 2 дня.

Ответ №1:

решение

Добавьте 2 класса и 1 дополнительный в Program.cs, чем это работает.

Учетная запись удаленного пользователя.cs

 public class CustomUserAccount : RemoteUserAccount
    {
        [JsonPropertyName("roles")]
        public string[] Roles { get; set; } = Array.Empty<string>();

    }
 

CustomAccountFactory.cs

 public class CustomAccountFactory
: AccountClaimsPrincipalFactory<CustomUserAccount>
{
    private readonly ILogger<CustomAccountFactory> logger;
    private readonly IServiceProvider serviceProvider;

    public CustomAccountFactory(IAccessTokenProviderAccessor accessor,
        IServiceProvider serviceProvider,
        ILogger<CustomAccountFactory> logger)
        : base(accessor)
    {
        this.serviceProvider = serviceProvider;
        this.logger = logger;
    }
    public async override ValueTask<ClaimsPrincipal> CreateUserAsync(
        CustomUserAccount account,
        RemoteAuthenticationUserOptions options)
    {
        var initialUser = await base.CreateUserAsync(account, options);

        if (initialUser.Identity.IsAuthenticated)
        {
            var userIdentity = (ClaimsIdentity)initialUser.Identity;

            foreach (var role in account.Roles)
            {
                userIdentity.AddClaim(new Claim("appRole", role));
            }
        }

        return initialUser;
    }
}
 

Программа.cs

 builder.Services.AddMsalAuthentication <RemoteAuthenticationState,
                 CustomUserAccount > (options =>
            {
                builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication);
                options.ProviderOptions.DefaultAccessTokenScopes
                    .Add("https://graph.microsoft.com/User.Read");
                options.ProviderOptions.LoginMode = "redirect";
                options.UserOptions.RoleClaim = "appRole";
            }).AddAccountClaimsPrincipalFactory<RemoteAuthenticationState, CustomUserAccount,
             CustomAccountFactory>();