Проверка подлинности файлов cookie в ASP.NET Core

В этой статье мы узнаем, как реализовать проверку подлинности с помощью файлов cookie в ASP.NET Core без использования удостоверений. Я постараюсь охватить каждый шаг, чтобы новички могли легко понять. Аутентификация — это процесс проверки личности пользователя. В этой статье мы авторизуем пользователя, проверив его учетные данные. Я использую Visual Studio 2019, чтобы продемонстрировать этот пример.

Давайте шаг за шагом реализуем аутентификацию с помощью файлов cookie в ASP.NET Core: Откройте Visual Studio и нажмите «Создать новый проект».

Проверка подлинности файлов cookie в ASP.NET Core

Выберите пустой проект ASP.NET Core и нажмите «Далее».

Проверка подлинности файлов cookie в ASP.NET Core

Дайте имя вашему проекту, выберите папку для создания проекта и нажмите Далее.

Проверка подлинности файлов cookie в ASP.NET Core

Выберите целевой фреймворк.В данном примере мы будем использовать Net Core 3.1. Выбирайте его и жмите «Далее».

Проверка подлинности файлов cookie в ASP.NET Core

Студия создаст все необходимые папки и файлы проекта, получившаяся структура проекта будет выглядеть следующим образом.

Проверка подлинности файлов cookie в ASP.NET Core

Поскольку мы создали пустой проект, давайте откроем файл Startup.cs и добавим выделенный код. В методе ConfigureServices я добавил службу AddControllersWithViews и промежуточное ПО UseEndpoints в методе Configure, как показано на изображении ниже.

services.AddControllersWithViews();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}"
);
});

 

Проверка подлинности файлов cookie в ASP.NET Core

Добавьте в проект папку Controllers, в которой мы будем создавать все контроллеры.

Проверка подлинности файлов cookie в ASP.NET Core

Давайте добавим HomeController, щелкнув правой кнопкой мыши папку Controller. Перейдите в «Добавить» и нажмите «Контроллер». Выберите пустой контроллер, как показано на рисунке ниже.

Проверка подлинности файлов cookie в ASP.NET Core

Проверка подлинности файлов cookie в ASP.NET Core

Щелкните проект правой кнопкой мыши и выберите «Управление пакетами NuGet». Найдите пакет Bootstrap (требуется только для стиля пользовательского интерфейса) и нажмите «Установить».

Проверка подлинности файлов cookie в ASP.NET Core

Чтобы обслуживать статические файлы, такие как js, css, изображения и т. Д., Нам необходимо использовать промежуточное ПО UseStaticFiles в методе Configure.

app.UseStaticFiles();

Проверка подлинности файлов cookie в ASP.NET Core

Я добавил методы действий в HomeController, то есть Index и ConfidentialData.

Проверка подлинности файлов cookie в ASP.NET Core

Таким образом, при нажатии на ссылку «Home» или «Confidential Data» на панели навигации, ниже будет отображаться.

Проверка подлинности файлов cookie в ASP.NET Core

Проверка подлинности файлов cookie в ASP.NET Core

Другой контроллер, то есть AccountController со страницей входа, как показано на изображении ниже.

Проверка подлинности файлов cookie в ASP.NET Core

В методе ConfigureServices файла Startup.cs создайте службы промежуточного слоя аутентификации с помощью методов AddAuthentication и AddCookie. Схема проверки подлинности, переданная в AddAuthentication, устанавливает схему проверки подлинности по умолчанию для приложения. CookieAuthenticationDefaults.AuthenticationScheme предоставляет «файлы cookie» для схемы. В методе расширения AddCookie установите для свойства LoginPath объекта CookieAuthenticationOptions значение «/account/login». Класс CookieAuthenticationOptions используется для настройки параметров поставщика аутентификации.

Проверка подлинности файлов cookie в ASP.NET Core

В методе Configure файла Startup.cs вызовите методы UseAuthentication и UseAuthorization перед вызовом конечных точек.

Проверка подлинности файлов cookie в ASP.NET Core

Теперь давайте добавим атрибут Authorize в метод действия ConfidentialData. Теперь только методы аутентификации могут получить доступ к этому ActionMethod.

Проверка подлинности файлов cookie в ASP.NET Core

Нажмите ссылку «Конфиденциальные данные» на панели навигации. Он будет перенаправлен на страницу «Учетная запись / Вход», поскольку пользователь еще не авторизован.

Проверка подлинности файлов cookie в ASP.NET Core

В AccountController метод действия Login получает returnurl в качестве параметра, на который пользователь должен быть перенаправлен после успешной авторизации. Ниже приведен код Login.cshtml, используемый в примере.

@model CookieAuthentication.Models.LoginModel

 

@{

    ViewData["Title"] = "Login";

    Layout = "~/Views/Shared/_Layout.cshtml";

}

 

<h2>Login</h2>

 

<hr />

<div class="row">

    <div class="col-md-4">

        <form asp-action="Login">

            <div asp-validation-summary="ModelOnly" class="text-danger"></div>

            @if (!string.IsNullOrEmpty(ViewBag.Message))

            {

                <span class="text-danger">

                    @ViewBag.Message

                </span>

            }

            @Html.HiddenFor(x => x.ReturnUrl)

            <div class="form-group">

                <label asp-for="UserName" class="control-label"></label>

                <input asp-for="UserName" class="form-control" />

                <span asp-validation-for="UserName" class="text-danger"></span>

            </div>

            <div class="form-group">

                <label asp-for="Password" class="control-label"></label>

                <input asp-for="Password" class="form-control" />

                <span asp-validation-for="Password" class="text-danger"></span>

            </div>

            <div class="form-group">

                <div class="checkbox">

                    <label>

                        <input asp-for="RememberLogin" /> @Html.DisplayNameFor(model => model.RememberLogin)

                    </label>

                </div>

            </div>

            <div class="form-group">

                <input type="submit" value="Login" class="btn btn-default" />

            </div>

        </form>

    </div>

</div>

Файл LoginModel.cs:

public class LoginModel

{

        [Required]

        [Display(Name ="Username")]

        public string UserName { get; set; }

        [Required]

        [DataType(DataType.Password)]

        public string Password { get; set; }

        public bool RememberLogin { get; set; }

        public string ReturnUrl { get; set; }

 

}

При нажатии на кнопку входа в систему будет запущено действие Post. В действии Post мы проверяем имя пользователя и пароль (в этом примере я использую жестко запрограммированные данные пользователя, но на самом деле вы можете проверить данные пользователя с помощью ORM, такого как EntityFramework, Dapper и т. Д. Если введенные учетные данные недействительны, тогда пользователю будет показано сообщение об ошибке. Если учетные данные верны, создайте ClaimsIdentity с необходимыми утверждениями. Вызовите SignInAsync, чтобы войти в систему пользователя.

public class AccountController : Controller

{

        //Sample Users Data, it can be fetched with the use of any ORM

        public List<UserModel> users = null;

        public AccountController()

        {

            users = new List<UserModel>();

            users.Add(new UserModel() { UserId = 1, Username = "Anoop", Password = "123", Role = "Admin" });

            users.Add(new UserModel() { UserId = 2, Username = "Other", Password = "123", Role = "User" });

        }

 

        public IActionResult Login(string ReturnUrl = "/")

        {

            LoginModel objLoginModel = new LoginModel();

            objLoginModel.ReturnUrl = ReturnUrl;

            return View(objLoginModel);

        }

        [HttpPost]

        public async Task<IActionResult> Login(LoginModel objLoginModel)

        {

            if (ModelState.IsValid)

            {

                var user = users.Where(x => x.Username == objLoginModel.UserName && x.Password == objLoginModel.Password).FirstOrDefault();

                if (user == null)

                {

                    //Add logic here to display some message to user

                    ViewBag.Message = "Invalid Credential";

                    return View(objLoginModel);

                }

                else

                {
                    //A claim is a statement about a subject by an issuer and

                    //represent attributes of the subject that are useful in the context of authentication and authorization operations.

                    var claims = new List<Claim>() {

                    new Claim(ClaimTypes.NameIdentifier,Convert.ToString(user.UserId)),

                    new Claim(ClaimTypes.Name,user.Username),

                    new Claim(ClaimTypes.Role,user.Role),

                    new Claim("FavoriteDrink","Tea")

                    };

                    //Initialize a new instance of the ClaimsIdentity with the claims and authentication scheme

                    var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);

                    //Initialize a new instance of the ClaimsPrincipal with ClaimsIdentity

                    var principal = new ClaimsPrincipal(identity);

                    //SignInAsync is a Extension method for Sign in a principal for the specified scheme.

                    await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,

                        principal, new AuthenticationProperties() { IsPersistent = objLoginModel.RememberLogin });

 

                    return LocalRedirect(objLoginModel.ReturnUrl);

                }

            }

            return View(objLoginModel);

        }

 

        public async Task<IActionResult> LogOut() {

            //SignOutAsync is Extension method for SignOut

            await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);

            //Redirect to home page

            return LocalRedirect("/");

        }

}

После того, как пользователь успешно войдет в приложение, будет создан файл cookie, как показано на изображении ниже. Этот зашифрованный файл cookie будет отправляться на сервер в каждом запросе и проверяться на сервере с помощью его ключа.

Проверка подлинности файлов cookie в ASP.NET Core

Для отображения информации о претензиях в представлении «Конфиденциальные данные» используется код, показанный ниже. В приведенном ниже коде мы проверяем, что пользователь должен пройти аутентификацию перед циклическим просмотром каждого утверждения.

Проверка подлинности файлов cookie в ASP.NET Core

Проверка подлинности файлов cookie в ASP.NET Core

Ссылка выхода из аккаунта отображается пользователю, который уже вошел в систему. При нажатии на ссылку выхода из системы мы вызываем метод SignOutAsync, который выполняет выход пользователя и удаляет его cookie.

public async Task<IActionResult> LogOut() {

            //SignOutAsync is Extension method for SignOut

            await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);

            //Redirect to home page

            return LocalRedirect("/");

}

Результат:

Проверка подлинности файлов cookie в ASP.NET Core

Надеюсь, эта статья помогла вам реализовать аутентификацию файлов cookie в ASP.