Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
ASP.NET Core Identity использует множество различных классов, предназначенных для различных задач. Рассмотрим основные из этих классов.
Для работы с базой данных ASP NET Identity использует контекст данных, который наследуется от класса IdentityDbContext из
пространства имен Microsoft.AspNetCore.Identity.EntityFrameworkCore
:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } }
По умолчанию данный класс наследует весь функционал от IdentityDbContext. Так, мы можем получить содержимое таблиц из бд с помощью следующих свойств:
Users: набор объектов IdentityUser, соответствует таблице пользователей
Roles: набор объектов IdentityRole, соответствует таблице ролей
RoleClaims: набор объектов IdentityRoleClaim, соответствует таблице связи ролей и объектов claims
UserLogins: набор объектов IdentityUserLogin, соответствует таблице связи пользователей с их логинами их внешних сервисов
UserClaims: набор объектов IdentityUserClaim, соответствует таблице связи пользователей и объектов claims
UserRoles: набор объектов IdentityUserRole, соответствует таблице, которая сопоставляет пользователей и их роли
UserTokens: набор объектов IdentityUserToken, соответствует таблице токенов пользователей
По умолчанию таблица, которая соответствует определенному набору, называется по имени набор плюс префикс AspNet. Например, таблица пользователей называется AspNetUsers.
Если нам надо хранить в базе данных объекты каких-то других классов, то в классе контекста можно определить для них свойство по типу DbSet<T>.
И мы можем напрямую работать с этим контекстом данных. Например, вывести всех пользователей:
public class AdminController : Controller { ApplicationDbContext _context; public AdminController(ApplicationDbContext context) { _context = context; } public IActionResult Index() { var users = _context.Users.ToList(); return View(users); } }
С помощью стандартного механизма внедрения зависимостей контекст данных внедряется в контроллер, и, получив в конструкторе, мы сможем его использовать.
В представлении выведем список объектов IdentityUser:
@model IEnumerable<Microsoft.AspNetCore.Identity.IdentityUser> @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <ul> @foreach (var user in Model) { <li>@user.Email</li> } </ul>
В ASP.NET Core Identity пользователь представлен классом IdentityUser из пространства имен
Microsoft.AspNetCore.Identity.EntityFrameworkCore
. Этот класс предоставляет базовую информацию о пользователе с помощью следующих свойств:
Id: уникальный идентификатор пользователя
UserName: ник пользователя
Email: электронный адрес пользователя
Logins: коллекция логинов, которые использовались пользователем для входа через сторонние сервисы (Google, Facebook и т.д.)
Claims: коллекция клеймов или дополнительных объектов, которые используются для авторизации пользователя
PasswordHash: хеш пароля. В базе данных напрямую не хранится пароль, а только его хеш.
Roles: набор ролей, к которым принадлежит пользователь
PhoneNumber: номер телефона
SecurityStamp: некоторое специальное значение, которое меняется при смене аутентификационных данных, например, пароля
AccessFailedCount: количество неудачных входов пользователя в систему
EmailConfirmed: подтвержден ли адрес электронной почты
PhoneNumberConfirmed: подтвержден ли номер телефона
Как правило, для управления пользователями используется не контекст данных, а специальный класс - UserManager<T> из пространства имен
Microsoft.AspNetCore.Identity
. Основные из его методов и свойств:
ChangePasswordAsync(user, old, new): изменяет пароль пользователя
CreateAsync(user): создает нового пользователя
DeleteAsync(user): удаляет пользователя
FindByIdAsync(id): ищет пользователя по id
FindByEmailAsync(email): ищет пользователя по email
FindByNameAsync(name): ищет пользователя по нику
UpdateAsync(user): обновляет пользователя
Users: возвращает всех пользователей
AddToRoleAsync(user, role): добавляет для пользователя user роль role
GetRolesAsync (user): возвращает список ролей, к которым принадлежит пользователь user
IsInRoleAsync(user, name): возвращает true, если пользователь user принадлежит роли name
RemoveFromRoleAsync(user, name): удаляет роль name у пользователя user
После добавления сервисов Identity в классе Startup мы можем получить объект UserManager через механизм внедрения зависимостей, например, через конструктор:
using System.Linq; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Identity; namespace IdentityApp.Controllers { public class AdminController : Controller { UserManager<IdentityUser> _userManager; public AdminController(UserManager<IdentityUser> manager) { _userManager = manager; } public IActionResult Index() { return View(_userManager.Users.ToList()); } } }
По умолчанию роль в ASP.NET Core Identity представлена классом IdentityRole, который определяет три свойства:
Id
: идентификатор роли
Name
: название роли
Users
: коллекция объектов IdentityUserRole
, через которые пользователи ассоциированы с данной ролью
Также, как и с пользователями, с ролями мы можем работать напрямую через контекст данных. Например:
using System.Linq; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Identity; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; namespace IdentityApp.Controllers { public class AdminController : Controller { ApplicationDbContext _context; public AdminController(ApplicationDbContext db) { _context = db; } public async Task<IActionResult> GetRoles() { _context.Add(new IdentityRole("simpleUser")); await _context.SaveChangesAsync(); return View(await _context.Roles.ToListAsync()); } } }
И в представлении мы можем вывести все роли:
@model IEnumerable<Microsoft.AspNetCore.Identity.IdentityRole> @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <ul> @foreach (var role in Model) { <li>@role.Name</li> } </ul>
Но, как правило, за работу с ролями в ASP.NET Core Identity отвечает класс RoleManager<T>, где параметр T представляет класс, описывающий роль. Этот класс представляет ряд методов ля управления ролями:
CreateAsync(role): создает новую роль
DeleteAsync(role): удаляет роль
FindByIdAsync(id): возвращает роль по id
FindByNameAsync(name): возвращает роль по названию
RoleExistsAsync(name): возвращает true, если роль с данным именем существует
UpdateAsync(role): обновляет роль
Roles: возвращает все роли
И также мы можем получить объект RoleManager в контроллерах через механизм внедрения зависимостей:
using System.Linq; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Identity; using System.Threading.Tasks; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; namespace IdentityApp.Controllers { public class AdminController : Controller { RoleManager<IdentityRole> _roleManager; public AdminController(RoleManager<IdentityRole> manager) { _roleManager = manager; } public async Task<IActionResult> GetRoles() { await _roleManager.CreateAsync(new IdentityRole { Name = "Admin", NormalizedName = "ADMIN" }); return View(await _roleManager.Roles.ToListAsync()); } } }
Чтобы воспользоваться классом RoleManager, нам надо изменить подключение сервисов Identity в классе Startup в методе ConfigureServices. По умолчанию оно выглядит так:
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>();
Изменим следующим образом:
services.AddIdentity<IdentityUser, IdentityRole>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>();
Метод AddIdentity типизируется классом роли - IdentityRole, тем самым также будет внедряться сервис RoleManager, который мы сможем получить в контроллере.