Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Для создания инфраструктуры для входа пользователей на сайт вначале добавим в проект в папку Models специальную модель LoginModel:
public class LoginModel { [Required] public string Email { get; set; } [Required] [DataType(DataType.Password)] public string Password { get; set; } }
В прошлой теме у нас уже был добавлен контроллер AccountController. Теперь же добавим в него следующие строки:
private IAuthenticationManager AuthenticationManager { get { return HttpContext.GetOwinContext().Authentication; } } public ActionResult Login(string returnUrl) { ViewBag.returnUrl = returnUrl; return View(); } [HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> Login(LoginModel model, string returnUrl) { if (ModelState.IsValid) { ApplicationUser user = await UserManager.FindAsync(model.Email, model.Password); if (user == null) { ModelState.AddModelError("", "Неверный логин или пароль."); } else { ClaimsIdentity claim = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); AuthenticationManager.SignOut(); AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = true }, claim); if (String.IsNullOrEmpty(returnUrl)) return RedirectToAction("Index", "Home"); return Redirect(returnUrl); } } ViewBag.returnUrl = returnUrl; return View(model); } public ActionResult Logout() { AuthenticationManager.SignOut(); return RedirectToAction("Login"); }
Вначале определяется новое свойство, представляющее объект IAuthenticationManager, с помощью которого мы будем управлять входом на сайт. Для этого интерфейс IAuthenticationManager определяет два метода:
SignIn()
: создает аутентификационные куки
SignOut()
: удаляет аутентификационные куки
В Get-версии метода Login мы получаем адрес для возврата и передаем его в преставление.
В Post-версии метода Login получаем данные из представления в виде модели LoginModel и по ним пытаемся получить пользователя из бд с помощью метода
UserManager.FindAsync(model.Email, model.Password)
. Этот метод возвращает объект ApplicationUser в случае успеха поиска.
AspNet Identity использует аутентификацию на основе объектов claim. Поэтому нам надо сначала создать объект ClaimsIdentity,
который представляет реализацию интерфейса IIdentity в AspNet Identity. Для создания ClaimsIdentity применяется метод CreateIdentityAsync()
И на финальном этапе вызывается метод AuthenticationManager.SignIn()
, в который передается объект конфигурации аутентификации
AuthenticationProperties
, а также ранее созданный объект ClaimsIdentity. Свойство IsPersistent
позволяет сохранять аутентификационные данные в браузере
даже после закрытия пользователем браузера.
И метод Logout
просто удаляет аутентификационные куки в браузере, как бы делая выход из системы.
Представление логина может выглядеть так:
@model AspNetIdentityApp.Models.LoginModel @{ ViewBag.Title = "Login"; } <h2>Вход на сайт</h2> @using (Html.BeginForm()) { @Html.AntiForgeryToken() <div> @Html.ValidationSummary() <input type="hidden" name="returnUrl" value="@ViewBag.returnUrl" /> <p> <label>Email</label><br /> @Html.EditorFor(x => x.Email) </p> <p> <label>Пароль</label><br /> @Html.EditorFor(x => x.Password) </p> <p><button type="submit">Войти</button></p> </div> }