Авторизация пользователей в Identity

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

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

Для создания механизма авторизации пользователей в приложении вначале добавим в проект из прошлой темы в папку ViewModels специальную модель LoginViewModel:

using System.ComponentModel.DataAnnotations;

namespace CustomIdentityApp.ViewModels
{
    public class LoginViewModel
    {
        [Required]
        [Display(Name = "Email")]
        public string Email { get; set; }
		
        [Required]
        [DataType(DataType.Password)]
        [Display(Name = "Пароль")]
        public string Password { get; set; }
		
		[Display(Name = "Запомнить?")]
        public bool RememberMe { get; set; }
		
		public string ReturnUrl { get; set; }
    }
}

В прошлой теме у нас уже был добавлен контроллер AccountController. Теперь же добавим в него следующие три метода:

[HttpGet]
public IActionResult Login(string returnUrl = null)
{
    return View(new LoginViewModel { ReturnUrl = returnUrl });
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel model)
{
    if (ModelState.IsValid)
    {
        var result = 
            await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, false);
        if (result.Succeeded)
        {
            // проверяем, принадлежит ли URL приложению
            if (!string.IsNullOrEmpty(model.ReturnUrl) && Url.IsLocalUrl(model.ReturnUrl))
            {
                return Redirect(model.ReturnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }
        else
        {
            ModelState.AddModelError("", "Неправильный логин и (или) пароль");
        }
    }
    return View(model);
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Logout()
{
    // удаляем аутентификационные куки
    await _signInManager.SignOutAsync();
    return RedirectToAction("Index", "Home");
}

В Get-версии метода Login мы получаем адрес для возврата в виде параметра returnUrl и передаем его в модель LoginViewModel.

В Post-версии метода Login получаем данные из представления в виде модели LoginViewModel. Всю работу по аутентификации пользователя выполняет метод signInManager.PasswordSignInAsync(). Этот метод принимает логин и пароль пользователя. Третий параметр метода указывает, надо ли сохранять устанавливаемые куки на долгое время.

Данный метод также возвращает IdentityResult, с помощью которого можно узнать, завершилась ли аутентификация успешно. Если она завершилось успешно, то используем свойство ReturnUrl модели LoginViewModel для возврата пользователя на предыдущее место. Для этого нужно еще удостовериться, что адрес возврата принадлежит приложению с помощью метода Url.IsLocalUrl(). Это позволит избежать перенаправлений на нежелательные сайты. Если же адрес возврата не установлен или не принадлежит приложению, выполняем переадресацию на главную страницу.

Третий метод - метод Logout выполняет выход пользователя из приложения. За выход отвечает метод _signInManager.SignOutAsync(), который очищает аутентификационные куки.

И теперь определим в проекте в папке Views/Account представление Login.cshtml, через которое будет осуществляться вход в приложение:

@model CustomIdentityApp.ViewModels.LoginViewModel

<h2>Вход в приложение</h2>
<form method="post" asp-controller="Account" asp-action="Login" 
      asp-route-returnUrl="@Model.ReturnUrl">
    <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="Password"></label><br />
        <input asp-for="Password" />
        <span asp-validation-for="Password"></span>
    </div>
    <div>
        <label asp-for="RememberMe"></label><br />
        <input asp-for="RememberMe" />
    </div>
    <div>
        <input type="submit" value="Войти" />
    </div>
</form>

Для проверки логина для простоты определим в представлении Index.cshtml контроллера HomeController вывод имени пользователя и ссылки на вход и регистрацию:

@{
    ViewData["Title"] = "Home Page";
}


@if(User.Identity.IsAuthenticated)
{
    <p>@User.Identity.Name</p>

    <form method="post" asp-controller="Account" asp-action="Logout">
        <input type="submit" value="Выход" />
    </form>
}
else
{
    <a asp-controller="Account" asp-action="Login">Вход</a>
    <a asp-controller="Account" asp-action="Register">Регистрация</a>
}

Запустим проект и выполним вход в приложение:

Авторизация в ASP.NET Identity Core

И после удачной авторизации на главной странице увидим свое имя и кнопку для выхода:

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