Проверка подлинности файлов 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, как показано на изображении ниже.

[pastacode lang=»c» manual=»services.AddControllersWithViews()%3B» message=»» highlight=»» provider=»manual»/]

[pastacode lang=»c» manual=»app.UseEndpoints(endpoints%20%3D%3E%0A%7B%0Aendpoints.MapControllerRoute(%0Aname%3A%20%22default%22%2C%0Apattern%3A%20%22%7Bcontroller%3DHome%7D%2F%7Baction%3DIndex%7D%2F%7Bid%3F%7D%22%0A)%3B%0A%7D)%3B» message=»» highlight=»» provider=»manual»/]

 

Проверка подлинности файлов 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.

[pastacode lang=»c» manual=»app.UseStaticFiles()%3B» message=»» highlight=»» provider=»manual»/]

Проверка подлинности файлов 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, используемый в примере.

[pastacode lang=»c» manual=»%40model%20CookieAuthentication.Models.LoginModel%0A%0A%20%0A%0A%40%7B%0A%0A%20%20%20%20ViewData%5B%22Title%22%5D%20%3D%20%22Login%22%3B%0A%0A%20%20%20%20Layout%20%3D%20%22~%2FViews%2FShared%2F_Layout.cshtml%22%3B%0A%0A%7D%0A%0A%20%0A%0A%3Ch2%3ELogin%3C%2Fh2%3E%0A%0A%20%0A%0A%3Chr%20%2F%3E%0A%0A%3Cdiv%20class%3D%22row%22%3E%0A%0A%20%20%20%20%3Cdiv%20class%3D%22col-md-4%22%3E%0A%0A%20%20%20%20%20%20%20%20%3Cform%20asp-action%3D%22Login%22%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20asp-validation-summary%3D%22ModelOnly%22%20class%3D%22text-danger%22%3E%3C%2Fdiv%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%40if%20(!string.IsNullOrEmpty(ViewBag.Message))%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cspan%20class%3D%22text-danger%22%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%40ViewBag.Message%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fspan%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%40Html.HiddenFor(x%20%3D%3E%20x.ReturnUrl)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22form-group%22%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Clabel%20asp-for%3D%22UserName%22%20class%3D%22control-label%22%3E%3C%2Flabel%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cinput%20asp-for%3D%22UserName%22%20class%3D%22form-control%22%20%2F%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cspan%20asp-validation-for%3D%22UserName%22%20class%3D%22text-danger%22%3E%3C%2Fspan%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22form-group%22%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Clabel%20asp-for%3D%22Password%22%20class%3D%22control-label%22%3E%3C%2Flabel%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cinput%20asp-for%3D%22Password%22%20class%3D%22form-control%22%20%2F%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cspan%20asp-validation-for%3D%22Password%22%20class%3D%22text-danger%22%3E%3C%2Fspan%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22form-group%22%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22checkbox%22%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Clabel%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cinput%20asp-for%3D%22RememberLogin%22%20%2F%3E%20%40Html.DisplayNameFor(model%20%3D%3E%20model.RememberLogin)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Flabel%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22form-group%22%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cinput%20type%3D%22submit%22%20value%3D%22Login%22%20class%3D%22btn%20btn-default%22%20%2F%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%0A%0A%20%20%20%20%20%20%20%20%3C%2Fform%3E%0A%0A%20%20%20%20%3C%2Fdiv%3E%0A%0A%3C%2Fdiv%3E» message=»» highlight=»» provider=»manual»/]

Файл LoginModel.cs:

[pastacode lang=»c» manual=»public%20class%20LoginModel%0A%0A%7B%0A%0A%20%20%20%20%20%20%20%20%5BRequired%5D%0A%0A%20%20%20%20%20%20%20%20%5BDisplay(Name%20%3D%22Username%22)%5D%0A%0A%20%20%20%20%20%20%20%20public%20string%20UserName%20%7B%20get%3B%20set%3B%20%7D%0A%0A%20%20%20%20%20%20%20%20%5BRequired%5D%0A%0A%20%20%20%20%20%20%20%20%5BDataType(DataType.Password)%5D%0A%0A%20%20%20%20%20%20%20%20public%20string%20Password%20%7B%20get%3B%20set%3B%20%7D%0A%0A%20%20%20%20%20%20%20%20public%20bool%20RememberLogin%20%7B%20get%3B%20set%3B%20%7D%0A%0A%20%20%20%20%20%20%20%20public%20string%20ReturnUrl%20%7B%20get%3B%20set%3B%20%7D%0A%0A%20%0A%0A%7D» message=»» highlight=»» provider=»manual»/]

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

[pastacode lang=»c» manual=»public%20class%20AccountController%20%3A%20Controller%0A%0A%7B%0A%0A%20%20%20%20%20%20%20%20%2F%2FSample%20Users%20Data%2C%20it%20can%20be%20fetched%20with%20the%20use%20of%20any%20ORM%0A%0A%20%20%20%20%20%20%20%20public%20List%3CUserModel%3E%20users%20%3D%20null%3B%0A%0A%20%20%20%20%20%20%20%20public%20AccountController()%0A%0A%20%20%20%20%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20users%20%3D%20new%20List%3CUserModel%3E()%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20users.Add(new%20UserModel()%20%7B%20UserId%20%3D%201%2C%20Username%20%3D%20%22Anoop%22%2C%20Password%20%3D%20%22123%22%2C%20Role%20%3D%20%22Admin%22%20%7D)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20users.Add(new%20UserModel()%20%7B%20UserId%20%3D%202%2C%20Username%20%3D%20%22Other%22%2C%20Password%20%3D%20%22123%22%2C%20Role%20%3D%20%22User%22%20%7D)%3B%0A%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%0A%0A%20%20%20%20%20%20%20%20public%20IActionResult%20Login(string%20ReturnUrl%20%3D%20%22%2F%22)%0A%0A%20%20%20%20%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20LoginModel%20objLoginModel%20%3D%20new%20LoginModel()%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20objLoginModel.ReturnUrl%20%3D%20ReturnUrl%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20View(objLoginModel)%3B%0A%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%5BHttpPost%5D%0A%0A%20%20%20%20%20%20%20%20public%20async%20Task%3CIActionResult%3E%20Login(LoginModel%20objLoginModel)%0A%0A%20%20%20%20%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(ModelState.IsValid)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20user%20%3D%20users.Where(x%20%3D%3E%20x.Username%20%3D%3D%20objLoginModel.UserName%20%26%26%20x.Password%20%3D%3D%20objLoginModel.Password).FirstOrDefault()%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(user%20%3D%3D%20null)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FAdd%20logic%20here%20to%20display%20some%20message%20to%20user%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ViewBag.Message%20%3D%20%22Invalid%20Credential%22%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20View(objLoginModel)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%0A» message=»» highlight=»» provider=»manual»/]

[pastacode lang=»c» manual=»%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FA%20claim%20is%20a%20statement%20about%20a%20subject%20by%20an%20issuer%20and%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Frepresent%20attributes%20of%20the%20subject%20that%20are%20useful%20in%20the%20context%20of%20authentication%20and%20authorization%20operations.%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20claims%20%3D%20new%20List%3CClaim%3E()%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20new%20Claim(ClaimTypes.NameIdentifier%2CConvert.ToString(user.UserId))%2C%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20new%20Claim(ClaimTypes.Name%2Cuser.Username)%2C%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20new%20Claim(ClaimTypes.Role%2Cuser.Role)%2C%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20new%20Claim(%22FavoriteDrink%22%2C%22Tea%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FInitialize%20a%20new%20instance%20of%20the%20ClaimsIdentity%20with%20the%20claims%20and%20authentication%20scheme%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20identity%20%3D%20new%20ClaimsIdentity(claims%2C%20CookieAuthenticationDefaults.AuthenticationScheme)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FInitialize%20a%20new%20instance%20of%20the%20ClaimsPrincipal%20with%20ClaimsIdentity%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20principal%20%3D%20new%20ClaimsPrincipal(identity)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FSignInAsync%20is%20a%20Extension%20method%20for%20Sign%20in%20a%20principal%20for%20the%20specified%20scheme.%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20await%20HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme%2C%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20principal%2C%20new%20AuthenticationProperties()%20%7B%20IsPersistent%20%3D%20objLoginModel.RememberLogin%20%7D)%3B%0A%0A%20%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20LocalRedirect(objLoginModel.ReturnUrl)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20View(objLoginModel)%3B%0A%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%0A%0A%20%20%20%20%20%20%20%20public%20async%20Task%3CIActionResult%3E%20LogOut()%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FSignOutAsync%20is%20Extension%20method%20for%20SignOut%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20await%20HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FRedirect%20to%20home%20page%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20LocalRedirect(%22%2F%22)%3B%0A%0A%20%20%20%20%20%20%20%20%7D%0A%0A%7D» message=»» highlight=»» provider=»manual»/]

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

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

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

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

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

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

[pastacode lang=»c» manual=»public%20async%20Task%3CIActionResult%3E%20LogOut()%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FSignOutAsync%20is%20Extension%20method%20for%20SignOut%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20await%20HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FRedirect%20to%20home%20page%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20LocalRedirect(%22%2F%22)%3B%0A%0A%7D» message=»» highlight=»» provider=»manual»/]

Результат:

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

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