Авторизация и аутентификация в ASP.NET Core с использованием ASP.NET Core Identity и JWT — fuse8

В одном из рабочих проектов мне нужно было внедрить авторизацию на основе 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.

Курсы ASP.NET Core — создание сайта на C# с ASP.NET на itProger

В курсе вы познакомитесь с платформой ASP.NET Core. Вы научитесь писать полноценные веб сайты на языке C#, а также научитесь работать с шаблоном MVC, изучите работу с базами данных и научитесь строить сайты со множеством страниц и функций.

Полезные ссылки:

  1. Полный курс по C#;
  2. Скачать Visual Studio.

Подавляющее большинство хоть что-то, но слышали о платформе ASP.NET (или же ASP NET CORE). Многие ошибочно называют платформу как ASP CORE NET, но это неверное название. Платформа называется ASP .NET, а приставка Core обозначает дословно – платформа. 

Знания относительно MVC ASP NET очень разбросанные и неструктурированные, от чего нет чёткого представления о возможностях данной платформы. В рамках данного материала рассмотрим ключевые особенности ASP.NET.

ASP.NET – это платформа для разработки в вебе (сайты, приложения). Она поддерживает работу с несколькими языками программирования, входящими в сборку фреймворка: Basic NET, C#, J# и ряд прочих. С данной платформой есть возможность создавать как простейшие веб-ресурсы, так и очень сложные сайты, способные к обработке многотысячного потока пользователей.

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

Популярнейшие технологии и языки программирования для разработки веб-ресурсов:

В нынешних реалиях ASP .NET невероятно популярна, она лежит в основе огромных интернет-порталов. Нам удалось найти хороший материал, в котором освещено 10 лучших веб-ресурсов, созданных на данной платформе. 

В этом списке присутствуют:

  • StackOverflow – это один из самых больших форумов. С его помощью тысячи людей ежедневно получают ответы на насущные вопросы;
  • Основной портал корпорации Microsoft;
  • Крупнейший сайт для регистрации доменов GoDaddy. Сегодня занимает лидирующие места в сфере веб-хостинга.  
  • Официальный веб-сайт Dell.

Этим список не ограничивается, есть масса других сайтов.

В ASP .NET применяется традиционная схема MVCМодель-Вид-Контроллер (ASP NET Core MVC). Эта же схема часто встречается в C# (C# MVC). Все элементы отвечают за конкретные действия. Для примера, пользователь запускает процесс регистрации и отправляет на сервер регистрационные данные. Контроллер интерпретирует действия человека и передаёт модели информацию о внесённых изменениях в статус пользователя. Модель реагирует на действия контроллера и работает с поставляемыми данными. Вид отвечает за отображение информации с модели.

Пример стандартной MVC C# представлен ниже. Точно такая же используется в ASP NET C#:

После отправки запроса на сервер, его начинает обрабатывать контроллер, затем передаёт изменения в модель, которая реагирует на обновление и выдаёт всё нужное для отображения сайта. Вид выполняет только роль отображения внешнего вида страницы – обычный HTML-шаблон.

Если подытожить, это очень удачная и перспективная технология. Отдав ей предпочтение, вы наверняка не пожалеете в будущем.

ASP .NET или ASP .NET Core?

.NET Core – кроссплатформенная среда выполнения для приложений из веба или консольных программ. Программные продукты, разработанные на ней, могут успешно исполняться на Linux, Windows, MacOS.

Основные плюсы: мультиплатформенность, открытый исходный код.

.NET Framework – среда исполнения, которая предназначена исключительно для Виндовс. Помогает в разработке десктопных программ под Windows и веб-приложений ASP .NET под IIS.

Ключевые достоинства: огромный ассортимент готовых библиотек, значительно больше возможностей в сравнении с прошлой платформой.

Сегодня Microsoft усиленно продвигает и модернизирует Core, постоянно добавляя полезный функционал. Может быть скоро эта среда сравняется с .NET Framework.

Пара сценариев для разработчиков веб-ресурсов на профессиональном уровне.

ASP .NET Core – лучше применять, если вы:

  • Желаете установить таргетинг в приложении на все популярные ОС;
  • Не страшитесь изучения нового;
  • Не боитесь уделять достаточно времени исправлениям и доработкам, ведь Core не дошёл до статической точки, периодически меняется.

ASP .NET – идеальное решение, если вы:

  • Не испытываете необходимости организовывать кросплатформенную поддержку веб-приложения;
  • Нуждаетесь в стабильной среде разработки;
  • Не имеете большого количества времени для разработки, то есть дедлайны поджимают;
  • Уже занимаетесь разработкой или модернизацией существующей программы;
  • Входите в состав команды, обладающей опытом работы с ASP.NET.

Тем, кто сегодня только планирует начать обучение и в ближайший год начать работать на крупные компании, ASP .NET Core идеально подходит. С этой средой вы получаете много перспектив на будущее.

В ходе курса для начинающих мы освоим платформу ASP Core и на её основе создадим сайта. Для его реализации мы будем использовать реальные примеры создания сайта, что отлично подойдут для понимания начинающим программистам.

К концу курса мы разработаем полноценный сайт. На базе полученных знаний вы сможете разрабатывать сайты на ASP NET.

Дополнительные курсы

Фреймворк .NET поддерживает множество языков, но самым популярным является C#. Прежде чем приступать к видео курсу вам следует изучить C#. На нашем ресурсе представлено множество курсов на эту тематику. Просмотреть их все можете по этой ссылке.

Введение в ASP.Net Identity 2.0

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

ASP.NET Identity позволяет добавлять настраиваемые функции входа/выхода из системы и настраиваемые функции профиля, упрощающие настройку данных о вошедшем в систему пользователе. Сегодня существует гораздо более широкий спектр вариантов хранения данных (который очень быстро увеличивается) для веб-приложений, и большинство разработчиков хотят, чтобы их веб-сайты могли использовать поставщиков социальных сетей для аутентификации и авторизации. Теперь, что означают два термина аутентификация и авторизация?

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

Авторизация — это процесс, посредством которого сервер определяет, есть ли у клиента разрешение на использование ресурса или доступ к файлу после успешной аутентификации.

В настоящее время пользователи будут входить в систему, вводя свое имя пользователя и слово для веб-сайта, на котором они зарегистрированы, как при традиционном входе на веб-сайт.

Теперь Интернет стал более социальным, где пользователи взаимодействуют друг с другом в режиме реального времени, используя поставщиков социальных каналов, таких как Facebook, Twitter, учетную запись Google, учетную запись Microsoft и многие другие. Разработчики, а также пользователи хотят иметь возможность входить в систему, используя эти идентификаторы социальных каналов, чтобы иметь богатый и динамичный опыт работы на веб-сайтах, которые должны включать перенаправление на основе входа в систему с использованием таких поставщиков.

Удостоверение ASP.NET можно использовать со всеми платформами, такими как ASP.NET MVC, веб-формы, веб-страницы. По умолчанию удостоверение ASP.NET будет хранить информацию о пользователях в базе данных. Теперь также можно хранить информацию о различных поставщиках хранилищ в зависимости от требований приложения. Различные поставщики данных могут быть SharePoint, табличными службами Azure и т. д.

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

Рисунок . Поток удостоверений и концептуальная конфигурация трехуровневой внутренней зоны ASP.NET.

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

  • Двухфакторная аутентификация. Двухфакторная аутентификация добавляет еще один уровень безопасности вашему веб-приложению. Раньше мы использовали только однофакторную аутентификацию, просто вводя имя пользователя и слово в веб-приложение, что делало нашу учетную запись менее безопасной, поскольку хакеры могли взломать ваше слово и украсть ваши личные данные. Для двухфакторной аутентификации требуется ваше имя пользователя и слово, а также одноразовое слово (OTP).
    Одноразовым словом может быть аппаратный токен или ваш мобильный телефон, либо PIN-код. Всякий раз, когда пользователь входит в свою учетную запись, ему необходимо пройти двухфакторную аутентификацию, сначала ваше имя пользователя и слово, а другое — аппаратный токен, который генерирует одноразовые слова для второго этапа процесса входа в систему. Каждый раз слово, сгенерированное токеном, будет уникальным и будет меняться каждый короткий промежуток времени. Двухфакторная аутентификация делает наш сайт намного сильнее по сравнению с однофакторной аутентификацией. Вы можете использовать ASP.NET Identity для защиты веб-приложений, а также веб-API.
  • Блокировка учетной записи: Если пользователь неправильно вводит слово и два кода фактора после определенного количества неверных попыток, которое может быть настроено разработчиком, его учетная запись будет заблокирована на определенный период времени. Разработчики также могут отключить эту функцию.
  • Подтверждение учетной записи: Идентификация ASP.
    NET позволяет нам подтвердить учетную запись, подтвердив адрес электронной почты пользователя. Эта функция используется большинством веб-сайтов для подтверждения своей электронной почты перед доступом к своим учетным записям и услугам. Это также предотвращает создание фиктивных учетных записей.
  • Сброс слова: эта функция позволяет пользователям сбросить свое слово, если они его забыли.
  • Поддержка IQueryable для пользователей и ролей: IQueryable для UsersStore и RolesStore помогает легко получить список пользователей и ролей.
  • Удалить учетную запись пользователя: вы не могли удалить пользователя с помощью UserManager в более ранних версиях ASP.NET Identity 1.0, но в ASP.NET 2.0 мы можем легко удалить пользователя с помощью UserManager.
  • Усовершенствованный валидатор слов: в более ранних версиях идентификатора ASP.NET валидатор слов проверял только минимальную длину слова, но теперь валидатор слов дает больше контроля над сложностью слова.

ASP. NET Identity призван заменить традиционную систему членства ASP.NET гораздо большей безопасностью и системой проверки подлинности. ASP.NET — это библиотека на основе открытого веб-интерфейса для .NET (OWIN). Visual Studio 2013 позволяет нам защитить веб-приложение с помощью удостоверения ASP.NET. На следующем рисунке показано диалоговое окно шаблона проекта Visual Studio 2013.

Теперь давайте создадим приложение MVC, и мы сможем увидеть кнопку «Изменить аутентификацию» с правой стороны, и, нажав на нее, мы сможем чтобы увидеть различные режимы аутентификации, как показано ниже.

Как мы видим, существует четыре режима аутентификации: без аутентификации, индивидуальные учетные записи пользователей, организационные учетные записи и аутентификация Windows. Давайте теперь посмотрим, что на самом деле означают эти термины.

  • Без аутентификации: Этот режим аутентификации не требует аутентификации пользователя для приложений.
  • Индивидуальные учетные записи пользователей:
    Этот тип приложения настроен на использование удостоверения ASP. NET для проверки подлинности пользователя, которое ранее было известно как членство в ASP.NET. ASP.NET Identify позволяет пользователю зарегистрировать учетную запись, либо создав учетную запись на самом веб-сайте, создав имя пользователя и слово, либо войдя в систему через социальные сети, такие как Twitter, Facebook, учетная запись Microsoft или Google.
  • Организационные учетные записи: Этот тип режима проверки подлинности будет настроен на использование Windows Identity Foundation (WIF) на основе учетных записей пользователей в Active Directory, Microsoft Azure Active Directory или Office 365.
  • Проверка подлинности Windows: Этот режим аутентификация будет поддерживать модуль Windows IIS IIS для аутентификации. IIS расшифровывается как Internet Information Services, который действует как веб-сервер для приложения .NET, специально разработанного для операционных систем Windows. Эта аутентификация предназначена для приложений интрасети.

По умолчанию приложение MVC будет выбрано как «Индивидуальная учетная запись пользователя», что указывает на то, что информация об учетной записи пользователя будет храниться в базе данных приложения, что означает отсутствие внешних входов в систему. Создав проект MVC с выбором по умолчанию, мы обнаружим, что проект будет включать AccountController и связанные представления для регистрации новых пользователей, а также для аутентификации пользователей, а также найдем несколько ссылок на сборки OWIN вместе с классом запуска OWIN. Поэтому, чтобы избежать трудностей, мы начнем с пустого проекта MVC при запуске.

Прежде чем двигаться дальше, давайте ознакомимся с частями ASP.NET Identity. Система идентификации ASP.NET состоит из следующих шести важных частей:

  • Пользователь.
  • Роль
  • Менеджер пользователей
  • Менеджер ролей
  • Диспетчер аутентификации
  • Entity Framework DBContext

Пользователь

Пользователь системы представлен объектом пользователя, где объект пользователя содержит базовую аутентификацию пользователя с помощью идентификатора пользователя и слова. Базовая аутентификация фиксируется классом IdentityUser. Класс IdentityUser может быть унаследован от пользовательского класса, который можно использовать для сбора сведений о профиле.

Роль

Объект Role представляет роль пользователя, где класс IdentityRole предоставляет эту базовую роль. Чтобы добавить больше описания роли, создайте собственный класс, который должен быть унаследован от класса IdentityRole.

Менеджер пользователей

Менеджер пользователей — это класс, который позволяет вам управлять пользователями. С помощью класса User Manager можно выполнить несколько задач, таких как создание или удаление учетной записи пользователя, изменение слов или добавление и удаление пользователей в роли, и для этих целей ASP.NET Identity поставляется с классом UserManager.

Менеджер ролей

Менеджер ролей — это класс, который позволяет нам управлять ролями. Менеджер ролей отвечает за создание или удаление роли и проверку существования роли в системе. Это можно сделать с помощью менеджера ролей, для этого используется класс RoleManager.

Диспетчер аутентификации

Все указанные выше классы имеют дело с пользователями и ролями соответственно и не выполняют никакой аутентификации сами по себе. За вход и выход отвечает Менеджер аутентификации. Подобно проверке подлинности с помощью форм, локальная учетная запись пользователя использует проверку подлинности на основе файлов cookie. Менеджер аутентификации представлен интерфейсом IAuthenticationManager.

Entity Framework DBContext

Схема таблицы базы данных не является жестко фиксированной, как в случае системы членства ASP.NET в ASP.NET Identity. На основе объектов пользователя и роли первый подход Entity Framework Code используется для создания схемы таблицы, что означает, что в базе данных создается отдельный столбец для каждой части профиля пользователя. В папке App_Data все предыдущие таблицы создаются по умолчанию в отдельной базе данных, но мы также можем использовать нашу собственную базу данных для хранения этой информации, указав базу данных. Для этого вы можете создать собственный класс DbContext, который наследуется от базового класса IdentityDbContext.

Идентификатор пользователя ASPNET

Идентификатор пользователя ASPNET

Учетная запись компьютера ASPNET должна иметь один и тот же пароль на обоих IRM и сервер данных. Полные права должны быть предоставлены папке RDPNT в данных сервер и в папку Temporary ASP.Net Files на сервере IRM. Затем пароль пользователя ASPNet указывается в файле machine.config.

1. Установите пароль пользователя ASPNET

  1. На серверах IRM и данных убедитесь, что пользователь ASPNET существует. Доступ к управлению компьютером из Меню Пуск/Программы/Администрирование. Разверните Локальные пользователи и группы. Выберите папку «Пользователи» и убедитесь, что пользователь ASPNET существует.
  2. Если нет, добавьте пользователя ASPNET с помощью следующей команды. НЕ добавляйте вручную пользователя ASPNET в управление компьютером.
    1. Откройте командную строку.
    2. В командной строке на диске C:/ введите «CD \windows\microsoft.net\framework\v2.0.50727».
    3. В каталоге v2.0.50727 введите «aspnet_regiis -I». и нажмите клавишу , чтобы добавить пользователя ASPNET в Управление компьютером

      Возможно, потребуется выйти и вернуться в Управление компьютером, чтобы увидеть пользователя ASPNET.


  3. Измените пароль ASPNET на сервере IRM и сервере данных на rdp123456.

2. Предоставьте пользователю ASPNET полные права на папку RDPNT

  1. На сервере данных Используйте проводник Windows, чтобы найти папку RDPNT
  2. Щелкните правой кнопкой мыши и выберите «Свойства», вкладка «Безопасность», «Добавить».
  3. Введите ASPNET в качестве имени объекта и нажмите OK
  4. Установите флажок Разрешить для полного доступа и нажмите кнопку ОК.

3. Предоставьте пользователю ASPNET полные права на папку файлов ASP.Net

  1. Используйте Проводник Windows, чтобы найти c:\windows\Microsoft.Net\Framework\v2.0.50727\Временная папка файлов ASP.Net.
  2. Щелкните правой кнопкой мыши и выберите «Свойства», вкладка «Безопасность», «Добавить».
  3. Введите ASPNET в качестве имени объекта и нажмите OK
  4. Установите флажок Разрешить для полного доступа и нажмите кнопку ОК.

4. Изменить machine.config

Примечание : пользователи версии Microsoft.Net Framework. выше 2.0 (т.е. v3.0, v3.5) следует следовать инструкциям ниже, используя путь к папке v.2.0.xxx. Это важно, так как файл ниже не находится в папке более поздней версии.

  1. С помощью Блокнота перейдите к «c:\windows\microsoft.net\framework\v2.0.xxx\config\machine.config» и откройте документ для изменения в Блокноте, щелкнув правой кнопкой мыши и с помощью команды «Открыть с помощью…».

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *