Документация по ASP.NET Core подробно объясняет, что такое претензия и как ее проверить. Однако нет информации о том, как создать новое утверждение и прикрепить его к объекту пользователя.

Здесь мы собираемся восполнить этот пробел и предоставить вам пошаговые инструкции о том, как добавить новое утверждение и использовать его в представлениях (страницах) или в любой другой части вашего приложения ASP.NET Core.

Проблема

Опишем задачу, которую мы собираемся решить.

  1. У нас есть проект ASP.NET Core (2.1+) с функциональностью аутентификации / авторизации по умолчанию, предоставляемой библиотекой ASP.NET Identity.
  2. У нас есть поле имени пользователя (например, ContactName) в нашем классе модели идентичности (пусть будет ApplicationUser).
  3. Мы хотим добавить значение этого 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 г.