#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>();