Документация по ASP.NET Core подробно объясняет, что такое претензия и как ее проверить. Однако нет информации о том, как создать новое утверждение и прикрепить его к объекту пользователя.
Здесь мы собираемся восполнить этот пробел и предоставить вам пошаговые инструкции о том, как добавить новое утверждение и использовать его в представлениях (страницах) или в любой другой части вашего приложения ASP.NET Core.
Проблема
Опишем задачу, которую мы собираемся решить.
- У нас есть проект ASP.NET Core (2.1+) с функциональностью аутентификации / авторизации по умолчанию, предоставляемой библиотекой ASP.NET Identity.
- У нас есть поле имени пользователя (например,
ContactName
) в нашем классе модели идентичности (пусть будетApplicationUser
). - Мы хотим добавить значение этого
ContactName
столбца к заявкам пользователя, а затем отображать его на нашей домашней странице (вместо электронной почты пользователя, показываемой по умолчанию), когда пользователь вошел в систему.
Вот шаги, которые мы собираемся выполнить для достижения нашей цели.
Шаг 1. Добавление новой заявки
1.1. Создание собственной фабрики по принципу претензий
Нам нужна реализация IUserClaimsPrincipalFactory
, которая добавит необходимую информацию (в нашем случае ContactName
) к заявкам пользователя. Самый простой способ сделать это - унаследовать наш новый класс от реализации по умолчанию IUserClaimsPrincipalFactory
и переопределить один метод - GenerateClaimsAsync
:
public class MyUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser> { public MyUserClaimsPrincipalFactory( UserManager<ApplicationUser> userManager, IOptions<IdentityOptions> optionsAccessor) : base(userManager, optionsAccessor) { } protected override async Task<ClaimsIdentity>GenerateClaimsAsync(ApplicationUser user) { var identity = await base.GenerateClaimsAsync(user); identity.AddClaim(new Claim("ContactName", user.ContactName ?? "[Click to edit profile]")); return identity; } }
1.2 Зарегистрируйте новый класс в контейнере DI
Затем нам нужно зарегистрировать наш новый класс в контейнере внедрения зависимостей. Лучше всего для этого использовать метод расширенияAddClaimsPrincipalFactory
:
public void ConfigureServices(IServiceCollection services) { . . . . . services.AddDefaultIdentity<ApplicationUser>() .AddDefaultUI(UIFramework.Bootstrap4) .AddEntityFrameworkStores<ApplicationDbContext>() .AddClaimsPrincipalFactory<MyUserClaimsPrincipalFactory>(); //<---- add this line }
Вот и все. Новое утверждение с идентификатором ContactName
будет добавлено к объекту, который представляет текущего пользователя.
Теперь нам нужно получить значение нового утверждения в нашем представлении (странице) Razor или где-нибудь еще в вашем приложении.
Шаг 2. Получение новой заявки
Чтобы получить значение любого утверждения, нам нужна только ссылка на объект ClaimsPrincipal
, который представляет текущего зарегистрированного пользователя. К этому объекту можно получить доступ через свойство User
любого представления (страницы) Razor или HttpContext.User
в классах контроллера или, в общем, в любом месте, где у вас есть доступ к объекту HttpContext
.
ClaimsPrincipal
содержит список всех утверждений, связанных с текущим пользователем, и вы можете вызвать его FindFirst
метод, чтобы получить необходимое утверждение, а затем прочитать свойство Value
этого утверждения.
Итак, нам просто нужно открыть _LoginPartical.cshtml
файл в папке Pages/Shared/
(или Views/Shared/
) и заменить следующую строку:
<a asp-area="" asp-controller="Manage" asp-action="Index" title="Manage">Hello @User.Identity.Name!</a>
с этим:
<a asp-area="" asp-controller="Manage" asp-action="Index" title="Manage">Hello @(User.FindFirst("ContactName").Value)!</a>
Выполнено!
Теперь вместо чего-то вроде Hello [email protected]
вверху вашей веб-страницы вы увидите что-то вроде этого:
Первоначально опубликовано в блоге .NET Stories 14 мая 2019 г.