Основные классы в ASP.NET Core Identity

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

Последнее обновление: 14.12.2019

ASP.NET Core Identity использует множество различных классов, предназначенных для различных задач. Рассмотрим основные из этих классов.

Контекст данных IdentityDbContext

Для работы с базой данных 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>

IdentityUser

В ASP.NET Core Identity пользователь представлен классом IdentityUser из пространства имен Microsoft.AspNetCore.Identity.EntityFrameworkCore. Этот класс предоставляет базовую информацию о пользователе с помощью следующих свойств:

  • Id: уникальный идентификатор пользователя

  • UserName: ник пользователя

  • Email: электронный адрес пользователя

  • Logins: коллекция логинов, которые использовались пользователем для входа через сторонние сервисы (Google, Facebook и т.д.)

  • Claims: коллекция клеймов или дополнительных объектов, которые используются для авторизации пользователя

  • PasswordHash: хеш пароля. В базе данных напрямую не хранится пароль, а только его хеш.

  • Roles: набор ролей, к которым принадлежит пользователь

  • PhoneNumber: номер телефона

  • SecurityStamp: некоторое специальное значение, которое меняется при смене аутентификационных данных, например, пароля

  • AccessFailedCount: количество неудачных входов пользователя в систему

  • EmailConfirmed: подтвержден ли адрес электронной почты

  • PhoneNumberConfirmed: подтвержден ли номер телефона

Менеджер пользователей UserManager

Как правило, для управления пользователями используется не контекст данных, а специальный класс - 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());
        }
    }
}

IdentityRole и RoleManager

По умолчанию роль в 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, который мы сможем получить в контроллере.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850