Добавление простой пользовательской аутентификации на основе файлов cookie в приложение .NET core 3.1

Я помолвлена! Нечасто в начале вы видите блог/учебник о том, как разработать код, но вот.

Я говорю это, потому что это обеспечивает контекст того, откуда взялся этот учебник. Мой жених и я хотим веб-сайт, чтобы гости могли отвечать на вопросы и выбирать блюда. Есть много вариантов готовых веб-сайтов (некоторые даже бесплатные), но я решил, что сделаю это сам.

Идея состоит в том, чтобы иметь веб-сайт, защищенный паролем. Однако вместо общего пароля, который означает, что гости затем должны вводить свои данные (имя и т. д.), мы хотели использовать специальный пароль для приглашения, который затем позволил бы сайту идентифицировать гостей и хранить их ответы непосредственно против них.

В конце концов, я смогу создать интерфейс органайзера для просмотра всех ответов, скорее всего, на базе GraphQL API! (У меня есть учебник Как создать .NET GraphQL API, если вы хотите узнать, как это сделать!)

Для этого я не хочу идентифицировать пользователей по электронной почте, а затем проверять предоставленный пароль; Я не знаю всех электронных писем и не хочу их вводить. Поэтому стандартной аутентификации в .NET core будет недостаточно.

Поэтому теперь мы можем перейти к сути руководства… Пользовательская аутентификация с помощью файлов cookie в ядре .NET!

Предполагая, что у вас уже есть веб-приложение .NET core в той или иной форме, я сразу перейду к важным частям.

В Startup.cs вам нужно включить код, который добавляет аутентификацию (и, в частности, аутентификацию на основе файлов cookie).

Чтобы этот код скомпилировался, вам также потребуется включить пакет NuGet «Microsoft.AspNetCore.Authentication.Cookies» и добавить его в список используемых в верхней части файла.

Итак, что это делает? Что ж:

  • В ConfigureServices он указывает .NET включить службы проверки подлинности, которые обрабатывают запросы, и что он должен использовать схему CookieAuthentication.
  • Затем вызов AddCookie позволяет вам установить свои собственные параметры, такие как LoginPath. По умолчанию путь входа приведет вас к /Accont/Login с параметром запроса для ReturnUrl.
  • Я хотел настроить это, так как на этом сайте нет понятия «Учетная запись». Вместо этого все привязано к «Приглашению».
  • В Configure добавляются две строки: app.UseAuthentication() и app.UseAuthorization(). Они добавляют фактическое промежуточное ПО в конвейер запросов, которые сами обрабатывают запросы.

Чтобы проверить это, просто добавьте атрибут [Authorize] к одному из действий вашего контроллера, и он должен перенаправить вас на маршрут входа в систему, который вы настроили выше (который, скорее всего, будет 404, поскольку он еще не существует).

Далее нам нужно обработать логин!

Для этого я создал новый контроллер под названием «AccessController». Он имеет два обработчика действий: public IActionResult Index() и public IActionResult Index(string passphrase).

К обработчику без параметров добавлен атрибут HttpGet (чтобы он был доступен только для запросов GET), а к другому добавлен атрибут HttpPost.

Обработчик GET прост: он возвращает представление с формой, содержащей один ввод (для «фразы-пароля»).

Обработчик POST немного сложнее:

  • Он обращается к репозиторию (я использую шаблон репозитория), чтобы получить Invite с помощью парольной фразы.
  • Затем, если приглашение возвращается, создается новый ClaimsPrincipal с некоторыми основными сведениями о приглашении.
  • Наконец, он «регистрирует» пользователя и перенаправляет его обратно на домашнюю страницу (именно здесь вы могли бы использовать параметр ReturnUrl, но, поскольку на данный момент есть только одно место, куда пользователь может перейти, это более позднее улучшение).

И как все это выглядит?

И это все! Простой не так ли? Идентификатор хранится в отношении принципала утверждений, поэтому я могу использовать его для быстрого и легкого получения приглашения в любых последующих запросах.

В качестве дополнительного выигрыша для этого вы можете просто использовать HttpContext.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Email) в любом методе обработчика внутри контроллера.

Далее я расскажу, как я настроил ядро ​​.NET с помощью ParcelJS для обработки моего внешнего интерфейса (подсказка: он короткий, так как с ним удивительно просто работать).

Первоначально опубликовано на https://mattlaw.dev.