Аутентификация и авторизация в ASP.NET Core MVC. Базовые классы ASP.NET Core Identity

Немного познакомившись с шаблоном Identity для ASP.NET Core MVC, приступим к более детальному изучению всей системы аутентификации пользователей. В этой части рассмотрим базовые классы ASP.NET Core Identity.

Класс IdentityDbContext

Класс IdentityDbContext определен в пространстве имен  Microsoft.AspNet.Identity.EntityFramework и является наследником DbContext. В этом классе определены свойства для управления списком пользователей приложения. В ASP.NET Core MVC также содержатся различные варианты класса IdentityDbContext, например, IdentityUserContext<TUser>, позволяющие определить класс пользователя, используемого в проекте, имеются классы, позволяющие задавать тип первичного ключа в БД и прочие. В любом случае, суть работы объектов этих классов — управление базой данных пользователями.

Например, мы можем создать представление со списком всех пользователей в системе. Для этого создадим новое приложение ASP.NET Core MVC с типом проверки подлинности «Индивидуальные учётные записи» и внесем следующие изменения в контроллер HomeController.cs:

 public class HomeController : Controller
 {
     private readonly ApplicationDbContext _context; 

     public HomeController(ILogger<HomeController> logger, ApplicationDbContext context)
     {
         _logger = logger;
         _context = context;
     }

     public IActionResult Index()
     {
         return View(_context.Users.ToList());
     }
}

Остальной код контроллера можно оставить как есть. Здесь мы запрашиваем контекст базы данных пользователей и возвращаем список пользователей из БД в представление Index.cshtml:

return View(_context.Users.ToList());

Теперь изменим представление Index.cshtml:

@using Microsoft.AspNetCore.Identity
@model List<IdentityUser>
@{
    ViewData["Title"] = "Home Page";
}

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <table border="1">
        <tr>
            <th>Id</th>
            <th>Login</th>
            <th>Email</th>
            <th>PasswordHash</th>
        </tr>
        <tbody>
            @foreach (var user in Model)
            {
                <tr>
                    <td>@user.Id</td>
                    <td>@user.UserName</td>
                    <td>@user.Email</td>
                    <td>@user.PasswordHash</td>
                </tr>
            }
        </tbody>
    </table>
</div>

Во-первых, мы подключили новое пространство имен

@using Microsoft.AspNetCore.Identity

и определили модель для представления:

@model List<IdentityUser>

Во-вторых, используя данные модели мы формируем таблицу, содержащую лишь несколько свойств пользователей, зарегистрированных в системе:

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <table border="1">
        <tr>
            <th>Id</th>
            <th>Login</th>
            <th>Email</th>
            <th>PasswordHash</th>
        </tr>
        <tbody>
            @foreach (var user in Model)
            {
                <tr>
                    <td>@user.Id</td>
                    <td>@user.UserName</td>
                    <td>@user.Email</td>
                    <td>@user.PasswordHash</td>
                </tr>
            }
        </tbody>
    </table>
</div>

После запуска приложения, если в системе есть зарегистрированные пользователи мы увидим следующую таблицу:

Аналогичным образом мы можем работать с любыми таблицами базы пользователей, про которые мы узнали в предыдущей части. В этом примере мы подошли к изучению следующего базового класса ASP.NET Core Identity — IdentityUser.

Класс IdentityUser

Класс IdentityUser представляет собой базовый класс пользователя и содержится в пространстве имен Microsoft.AspNetCore.Identity. Класс содержит основные свойства пользователя, а именно:

Id Идентификатор пользователя
UserName Имя пользователя
Email Email пользователя.
PasswordHash Хэш-представление пароля
PhoneNumber Номер телефона
ConcurrencyStamp Случайное значение, которое должно изменяться всякий раз, когда пользователь сохраняется в хранилище
SecurityStamp Случайное значение, которое должно изменяться при каждом изменении учетных данных пользователя (изменение пароля, удаление имени пользователя и т.д).
EmailConfirmed Флаг, указывающий, подтвердил ли пользователь свой адрес электронной почты.
PhoneNumberConfirmed Флаг, указывающий, подтвердил ли пользователь номер своего телефона.
LockoutEnabled Флаг, указывающий, может ли пользователь быть заблокирован.
TwoFactorEnabled Флаг, указывающий, включена ли двухфакторная проверка подлинности для этого пользователя.
AccessFailedCount Количество неудачных попыток входа для текущего пользователя.
LockoutEnd Возвращает или задает дату и время в формате UTC, когда завершается блокировка пользователя.
NormalizedEmail Возвращает или задает нормализованный адрес электронной почты для этого пользователя.
NormalizedUserName Возвращает или задает нормализованное имя пользователя для этого пользователя.

Обычно, мы будем использовать свои классы, производные от IdentityUser, например:

using Microsoft.AspNetCore.Identity;
namespace AspMvcAuthEmpty2.Models
{
    public class User: IdentityUser<int>
    {
    }
}

то есть первичный ключ в БД для таких пользователей будет представлен целым числом. Аналогичным образом можно создавать классы пользователей с другими типами первичных ключей. По умолчанию, в качестве первичного ключа для IdentityUser используется строка (string).

Класс UserManager

Для непосредственного управления учётными записями пользователей в ASP.NET Core MVC предусмотрен класс UserManager. Познакомиться с этим классом мы могли в предыдущей части, когда переопределяли шаблон регистрации пользователя. Класс UserManager там использовался в модели регистрации. Этот класс содержит достаточно много различных методов для управления учётными записями пользователей. Вот только некоторые из них:

AddClaimAsync(TUser, Claim) Добавляет заданный объект claim  к учётной записи пользователя
AddToRoleAsync(TUser, String) Добавляет пользователя в определенную роль.
CheckPasswordAsync(TUser, String) Возвращает флаг, указывающий, является ли заданный пароль допустимым для указанного пользователя.
CreateAsync(TUser, String) Создает запись нового пользователя с заданным паролем в БД
DeleteAsync(TUser) Удаляет пользователя из БД
FindByEmailAsync(String) Возвращает пользователя по адресу его email.
FindByIdAsync(String) Возвращает пользователя по его Id.
FindByNameAsync(String) Возвращает пользователя по его имени (UserName)
GetClaimsAsync(TUser) Возвращает список объектов Claim, принадлежащих пользователю
GetRolesAsync(TUser) Возвращает список ролей, к которым принадлежит указанный пользователь
IsInRoleAsync(TUser, String) Возвращает флаг, указывающий, принадлежит ли указанный пользователь заданной роли
UpdateUserAsync(TUser) Обновляет запись пользователя

 

Класс SignInManager

Класс SignInManager предоставляет методы для входа пользователей. Ниже представлены основные методы этого класса

CanSignInAsync(TUser) Возвращает флаг, указывающий, может ли указанный пользователь выполнить вход.
CheckPasswordSignInAsync(TUser, String, Boolean) Пытается выполнить вход с помощью пароля для пользователя.
CreateUserPrincipalAsync(TUser) Создает для указанного объекта пользователя объект класса ClaimsPrincipal.
IsLockedOut(TUser) Используется для определения того, считается ли пользователь заблокированным.
IsSignedIn(ClaimsPrincipal) Возвращает true, если пользователь аутентифицирован
PasswordSignInAsync(String, String, Boolean, Boolean) Пытается выполнить вход, используя логин и пароль пользователя
ResetLockout(TUser) Используется для сброса количества блокировок пользователя.
SignOutAsync() Выполняет выход пользователя из приложения.

Итого

Рассмотренные выше классы можно отнести к основным, так как без них мы вряд ли сможем построить свою систему аутентификации пользователей с использованием ASP.NET Core Identity. Эти классы далеко не единственные — в ASP.NET Core Identity есть и другие классы, позволяющие сделать систему аутентификации более гибкой и отвечающей нашим потребностям. И в следующих частях мы попробуем разработать собственную систему аутентификации пользователей «с нуля», используя ASP.NET Core Identity.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии