Регистрация и создание пользователей в Identity

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

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

Продолжим работу с проектом из прошлой темы и добавим в него функционал регистрации пользователей.

Пользователи в приложении представлены классом User, который наследует множество свойств. Однако нам необязательно всех их устанавливать. Достаточно установить ключевые свойства вроде логина и пароля. Для этого лучше воспользоваться вспомогательной моделью, которая установит все необходимые свойства.

Итак, добавим в проект новую папку, которую назовем ViewModels. Затем в этой папке определим новый класс RegisterViewModel, который будет представлять регистрирующегося пользователя:

using System.ComponentModel.DataAnnotations;

namespace CustomIdentityApp.ViewModels
{
    public class RegisterViewModel
    {
        [Required]
        [Display(Name = "Email")]
        public string Email { get; set; }

        [Required]
        [Display(Name = "Год рождения")]
        public int Year { get; set; }

        [Required]
        [DataType(DataType.Password)]
        [Display(Name = "Пароль")]
        public string Password { get; set; }

        [Required]
        [Compare("Password", ErrorMessage = "Пароли не совпадают")]
        [DataType(DataType.Password)]
        [Display(Name = "Подтвердить пароль")]
        public string PasswordConfirm { get; set; }
    }
}

Для работы с учетными записями пользователей добавим в папку Controllers новый контроллер AccountController и определим в нем метод для регистрации пользователей:

using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using CustomIdentityApp.ViewModels;
using CustomIdentityApp.Models;
using Microsoft.AspNetCore.Identity;

namespace CustomIdentityApp.Controllers
{
    public class AccountController : Controller
    {
        private readonly UserManager<User> _userManager;
        private readonly SignInManager<User> _signInManager;

        public AccountController(UserManager<User> userManager, SignInManager<User> signInManager)
        {
            _userManager = userManager;
            _signInManager = signInManager;
        }
        [HttpGet]
        public IActionResult Register()
        {
            return View();
        }
        [HttpPost]
        public async Task<IActionResult> Register(RegisterViewModel model)
        {
            if(ModelState.IsValid)
            {
                User user = new User { Email = model.Email, UserName = model.Email, Year=model.Year};
				// добавляем пользователя
                var result = await _userManager.CreateAsync(user, model.Password);
                if (result.Succeeded)
                {
                    // установка куки
                    await _signInManager.SignInAsync(user, false);
                    return RedirectToAction("Index", "Home");
                }
                else
                {
                    foreach (var error in result.Errors)
                    {
                        ModelState.AddModelError(string.Empty, error.Description);
                    }
                }
            }
            return View(model);
        }
    }
}

Поскольку в классе Startup были добавлены сервисы Identity, то здесь в контроллере через конструктор мы можем их получить. В данном случае мы получаем сервис по управлению пользователями - UserManager и сервис SignInManager, который позволяет аутентифицировать пользователя и устанавливать или удалять его куки.

С помощью метода _userManager.CreateAsync пользователь добавляется в базу данных. В качестве параметра передается сам пользователь и его пароль.

Данный метод возвращает объект IdentityResult, с помощью которого можно узнать успешность выполненной операции. Вполне возможно, что переданные значения не удовлетворяют требованиям, и тогда пользователь не будет добавлен в базу данных. В случае удачного добавления с помощью метода _signInManager.SignInAsync() устанавливаем аутентификационные куки для добавленного пользователя. В этот метод передается объект пользователя, который аутентифицируется, и логическое значение, указывающее, надо ли сохранять куки в течение продолжительного времени. И далее выполняем переадресацию на главную страницу приложения.

Если добавление прошло неудачно, то добавляем к состоянию модели с помощью метода ModelState все возникшие при добавлении ошибки, и отправленная модель возвращается в представление.

Для представлений этого контроллера в каталоге Views определим подкаталог Account, в который добавим новое представление Register.cshtml. Это представление будет служить для регистрации пользователя:

@model CustomIdentityApp.ViewModels.RegisterViewModel
<h2>Регистрация нового пользователя</h2>
<form method="post" asp-controller="Account" asp-action="Register">
    <div asp-validation-summary="ModelOnly"></div>
    <div>
        <label asp-for="Email"></label><br />
        <input asp-for="Email" />
        <span asp-validation-for="Email"></span>
    </div>
    <div>
        <label asp-for="Year"></label><br />
        <input asp-for="Year" />
        <span asp-validation-for="Year"></span>
    </div>
    <div>
        <label asp-for="Password"></label><br />
        <input asp-for="Password" />
        <span asp-validation-for="Password"></span>
    </div>
    <div>
        <label asp-for="PasswordConfirm"></label><br />
        <input asp-for="PasswordConfirm" />
        <span asp-validation-for="PasswordConfirm"></span>
    </div>
    <div>
        <input type="submit" value="Регистрация" />
    </div>
</form>

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

Структура проекта в ASP.NET Identity Core

Запустим приложение и обратимся к действию регистрации. Введем какие-нибудь данные:

Регистрация в ASP.NET Core Identity

После удачной регистрации нас переадресует на главную страницу.

После добавленяи первого пользователя через окно SQL Server Objects Explorer мы можем увидеть созданную базу данных:

Добавление базы данных в ASP.NET Identity Core

А в самой базе данных в таблице dbo.AspNetUsers мы сможем увидеть добавленного пользователя.

Добавление пользователя в ASP.NET Core Identity
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850