Немного познакомившись с шаблоном Identity для ASP.NET Core MVC, приступим к более детальному изучению всей системы аутентификации пользователей. В этой части рассмотрим базовые классы ASP.NET Core Identity.
Класс Identity DbContext
Класс IdentityDbContext
определен в пространстве имен Microsoft.AspNet.Identity.EntityFramework
и является наследником DbContext
. В этом классе определены свойства для управления списком пользователей приложения. В ASP.NET Core MVC также содержатся различные варианты класса IdentityDbContext
, например, Identity
, позволяющие определить класс пользователя, используемого в проекте, имеются классы, позволяющие задавать тип первичного ключа в БД и прочие. В любом случае, суть работы объектов этих классов — управление базой данных пользователями.
Например, мы можем создать представление со списком всех пользователей в системе. Для этого создадим новое приложение 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.
. Класс содержит основные свойства пользователя, а именно:
Id |
Идентификатор пользователя |
User |
Имя пользователя |
Email |
Email пользователя. |
Password |
Хэш-представление пароля |
Phone |
Номер телефона |
Concurrency |
Случайное значение, которое должно изменяться всякий раз, когда пользователь сохраняется в хранилище |
Security |
Случайное значение, которое должно изменяться при каждом изменении учетных данных пользователя (изменение пароля, удаление имени пользователя и т.д). |
Email |
Флаг, указывающий, подтвердил ли пользователь свой адрес электронной почты. |
Phone |
Флаг, указывающий, подтвердил ли пользователь номер своего телефона. |
Lockout |
Флаг, указывающий, может ли пользователь быть заблокирован. |
Two |
Флаг, указывающий, включена ли двухфакторная проверка подлинности для этого пользователя. |
Access |
Количество неудачных попыток входа для текущего пользователя. |
Lockout |
Возвращает или задает дату и время в формате UTC, когда завершается блокировка пользователя. |
Normalized |
Возвращает или задает нормализованный адрес электронной почты для этого пользователя. |
Normalized |
Возвращает или задает нормализованное имя пользователя для этого пользователя. |
Обычно, мы будем использовать свои классы, производные от IdentityUser
, например:
using Microsoft.AspNetCore.Identity; namespace AspMvcAuthEmpty2.Models { public class User: IdentityUser<int> { } }
то есть первичный ключ в БД для таких пользователей будет представлен целым числом. Аналогичным образом можно создавать классы пользователей с другими типами первичных ключей. По умолчанию, в качестве первичного ключа для IdentityUser
используется строка (string
).
Класс UserManager
Для непосредственного управления учётными записями пользователей в ASP.NET Core MVC предусмотрен класс UserManager
. Познакомиться с этим классом мы могли в предыдущей части, когда переопределяли шаблон регистрации пользователя. Класс UserManager
там использовался в модели регистрации. Этот класс содержит достаточно много различных методов для управления учётными записями пользователей. Вот только некоторые из них:
Add |
Добавляет заданный объект claim к учётной записи пользователя |
Add |
Добавляет пользователя в определенную роль. |
Check |
Возвращает флаг, указывающий, является ли заданный пароль допустимым для указанного пользователя. |
Create |
Создает запись нового пользователя с заданным паролем в БД |
Delete |
Удаляет пользователя из БД |
Find |
Возвращает пользователя по адресу его email. |
Find |
Возвращает пользователя по его Id . |
Find |
Возвращает пользователя по его имени (UserName ) |
Get |
Возвращает список объектов Claim , принадлежащих пользователю |
Get |
Возвращает список ролей, к которым принадлежит указанный пользователь |
Is |
Возвращает флаг, указывающий, принадлежит ли указанный пользователь заданной роли |
Update |
Обновляет запись пользователя |
Класс SignInManager
Класс SignInManager
предоставляет методы для входа пользователей. Ниже представлены основные методы этого класса
Can |
Возвращает флаг, указывающий, может ли указанный пользователь выполнить вход. |
Check |
Пытается выполнить вход с помощью пароля для пользователя. |
Create |
Создает для указанного объекта пользователя объект класса ClaimsPrincipal . |
Is |
Используется для определения того, считается ли пользователь заблокированным. |
Is |
Возвращает true , если пользователь аутентифицирован |
Password |
Пытается выполнить вход, используя логин и пароль пользователя |
Reset |
Используется для сброса количества блокировок пользователя. |
Sign |
Выполняет выход пользователя из приложения. |
Итого
Рассмотренные выше классы можно отнести к основным, так как без них мы вряд ли сможем построить свою систему аутентификации пользователей с использованием ASP.NET Core Identity. Эти классы далеко не единственные — в ASP.NET Core Identity есть и другие классы, позволяющие сделать систему аутентификации более гибкой и отвечающей нашим потребностям. И в следующих частях мы попробуем разработать собственную систему аутентификации пользователей «с нуля», используя ASP.NET Core Identity.