Yandex.Metrika Counter

В одном из рабочих проектов мне нужно было внедрить авторизацию на основе ASP.NET Core Identity и JWT. Подробного гайда о том, как это сделать, я не нашла. И потому написала свой.

В этой статье я расскажу о структуре JWT и схеме работы ASP.NET Core Identity и JWT вместе. Во второй части — на живом примере покажу, как реализовать авторизацию в ASP.NET Core 3.1 с использованием этих технологий.

Аутентификация и авторизация — одни из обязательных частей RESTful API. В ASP.NET есть встроенная система аутентификациии и авторизации — ASP.NET Identity. Она дает возможность создавать учетные записи и управлять ими,  аутентифицироваться или входить на сайт через профили Google, Facebook, Microsoft и других внешних провайдеров.

ASP.NET Core поддерживает еще и Json Web Token (JWT). Эта технология предоставляет авторизовавшемуся пользователю уникальный идентификатор – токен. С его помощью пользователь взаимодействует с веб-приложением.

Подключить авторизацию на основе JWT в ASP.NET Core достаточно просто. Давайте разберемся, как это сделать. 

Сперва рассмотрим структуру JWT и алгоритм создания токенов

Затем разберемся в схеме работы ASP.NET Core Identity и JWT.  

Структура и алгоритм создания JWT

JSON Web Token (JWT) — это открытый стандарт RFC 7519, который используют для компактной, автономной и безопасной передачи данных в виде объекта JSON. 

JWT состоит из трех блоков, разделенных точками: заголовок(header), поля (payload) и подпись (signature). Header и payload формируются отдельно, затем на их основе вычисляется signature.

Алгоритм создания JWT

  1. Блоки заголовок (header) и поля (payload) представляются в виде UTF-8 строк.
  2. Переводим оба блока в массивы байтов, затем кодируем, используя алгоритм base64. Результатом будет строка header.payload.
  3. Для строки header.payload генерируем подпись signature, используя алгоритм из параметра header «alg» и secret key (который известен только серверу). Кодируем полученную подпись signature, используя алгоритм base64.
  4. Формируем JWT из полученных блоков через точку: header.payload.signature.
    Структура JWT

Схема работы ASP.NET Core Identity и JWT

  1. Клиент идет с запросом на сервер, передавая свои данные (например, username и password), чтобы получить JWT.
  2. Сервер проверяет username и password, используя SignInManager: если проверка прошла успешно, генерирует JWT и передаёт его клиенту, если нет  — возвращает 401 ошибку.
     
    В дальнейшем сервер будет проверять этот токен  перед выполнением каждого клиентского запроса. 

    Из соображений безопасности токен имеет ограниченный срок жизни. Как только это время истечет, клиенту нужно будет запросить его заново, используя refresh token.

  3. Далее клиент обращается к серверу, используя JWT, передавая его, например, через HTTP-заголовок.
  4. Сервер декодирует header и payload, проверяет зарезервированные поля, и по указанному в header алгоритму с помощью secret key составляется подпись. Затем полученная подпись проверяется на совпадение с переданной. В случае успеха пользователь авторизуется и получает запрошенные данные. Если подписи не совпали, на запрос вернётся ошибка 401. 

На этом с теорией закончим. Во второй части статьи будет практика — покажу пошагово, как прикрутить авторизацию в ASP.NET Core 3.1 через ASP.NET Core Identity и JWT.