Я создал проект режима автоматического рендеринга веб-приложения blazor с отдельными учетными записями, в PersistingRevalidatingAuthenticationStateProvider он выбирает только одну роль:
var role = principal.FindFirst(options.ClaimsIdentity.RoleClaimType)?.Value;
Но у меня есть пользователь с двумя ролями, почему в моем приложении в следующем коде появляются оба объектаauthorizeView, тогда как в PersistingRevalidatingAuthenticationStateProvider я получаю только одну?
Разве AuthorizeView не должен отображаться только для одной из ролей?
<AuthorizeView Roles=‘@Roles.Admin’>
<br />
<h2>You are Admin!</h2>
</AuthorizeView>
<AuthorizeView Roles=‘@Roles.User’>
<br />
<h2>You are User!</h2>
</AuthorizeView>
Может кто-нибудь объяснить мне это.
.FindFirst()
принимает только первую запись для этого утверждения, поэтому вам следует использовать .FindAll()
, чтобы перечислить все утверждения.
var getRoleClaims = principal.FindAll(options.ClaimsIdentity.RoleClaimType);
foreach (var claim in getRoleClaims) {
var roleName = claim.Value;
}
Скриншот пользователя с ролью «Администратор»
@FranciscoFernandes По умолчанию поставщик утверждений добавляет все роли пользователя. Даже если вы используете FindFirst()
, это просто извлекает заявку из списка уже зарегистрированных заявок. В вашем случае вы извлекаете пользователя, но и пользователь, и администратор уже существуют в заявках.
ах, хорошо, значит, по умолчанию поставщик утверждений добавляет все роли пользователей, размещение FindFirst или FindAll не важно, потому что они уже есть по умолчанию? или мне все равно следует использовать FindAll, или я могу просто удалить var role = main.FindFirst(options.ClaimsIdentity.RoleClaimType)?.Value;` и ничего не делать, поскольку он делает это по умолчанию?
@FranciscoFernandes да, все претензии там уже зарегистрированы. Что делает FindFirst
или FindAll
, так это просто читает данные. Если вы действительно хотите изменить утверждения при входе в систему, вы можете обратиться к преобразователю утверждений; Learn.microsoft.com/en-us/aspnet/core/security/authenticationn/…
ОК, спасибо за объяснение.
На самом деле это не мой вопрос. У меня есть пользователь с ролями администратора и пользователя. Я хочу знать, почему, поскольку у меня есть только одна роль из-за FindFirst, и я сохраняю ее только в утверждении, почему, когда я запускаю приложение, оба авторизацииView видны, поскольку, например, у меня есть только роль администратора, хранящаяся в утверждении. Разве не должно появиться только окно авторизации администратора?