Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
Продолжим работу с проектом из прошлой темы и добавим в него функционал регистрации пользователей.
Пользователи в приложении представлены классом 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>
В итоге вся структура проекта на данный момент будет выглядеть следующим образом:
Запустим приложение и обратимся к действию регистрации. Введем какие-нибудь данные:
После удачной регистрации нас переадресует на главную страницу.
После добавленяи первого пользователя через окно SQL Server Objects Explorer мы можем увидеть созданную базу данных:
А в самой базе данных в таблице dbo.AspNetUsers мы сможем увидеть добавленного пользователя.