- PVSM.RU - https://www.pvsm.ru -
Этим постом я хочу открыть ветку статей посвященную IdentityServer4. Начнем мы с основных понятий.
Самым перспективным на текущий момент протоколом аутентификации является OpenID Connect [1], а протоколом авторизации (предоставления доступа) является OAuth 2.0 [2]. IdentityServer4 [3] реализует эти два протокола. Он оптимизирован для решения типичных проблем безопасности.
OpenID Connect [1] — это протокол и стандарт аутентификации, он не дает доступ к ресурсам (Web API), но т.к. он разработан поверх протокола авторизации OAuth 2.0 [2], он позволяет получить параметры профиля пользователя как будто вы получили доступ к ресурсу UserInfo [4].
JWT [5] (JSON Web Token) представляет собой веб-стандарт, который определяет способ передачи данных о пользователе в формате JSON в зашифрованном виде.
OAuth 2.0 (RFC 6749) [6] — это протокол и стандарт авторизации. Он позволяет приложениям получить доступ к защищенным ресурсам, например к Web API.
Взглянем на диаграмму обращения к защищенному ресурсу и разберемся с основными шагами и принятой терминологией:
Клиент запрашивает у пользователя разрешение пройти авторизацию от его имени. Клиент — это клиентское приложение обращающиеся к защищённым ресурсам от имени владельца ресурсов. Ресурс — это все наши защищенные сервисы Web API [7].
User разрешает клиентскому приложению пройти авторизацию от его имени, например, вводит логин и пароль. Логин и пароль будут являться грантом авторизации для клиентского приложения. User (владелец ресурса) — программа или человек, который может выдать доступ к защищённым ресурсам, например, путем ввода логина (username) и пароля (password);
Клиентское приложение запрашивает токен доступа у IdentityServer4
путём предоставления информации о самом себе (client_id
, client_secret
), предоставления разрешения на авторизацию от пользователя (username
, password
) и предоставления grant_type
и scope
. Затем сервер авторизации проверяет подлинность клиента и реквизиты владельца ресурса (логин и пароль).
Протокол OAuth 2.0 проводит аутентификации не только пользователя, но и клиентского приложения, осуществляющего доступ к ресурсам. Для этого протокол предусматривает такие параметры как client_id и client_secret.
сlient_id — это идентификатор клиентского приложения, используемыйIdentityServer4
для поиска информации о клиенте.
client_secret является аналогом пароля для клиентского приложения и используется для аутентификации клиентского приложения наIdentityServer4
. Секрет клиента должен быть известен только приложению и API. Исходя из вышесказанного делаем вывод что IdentityServer4 должен знать о своих клиентах.
Если подлинность приложения подтверждена и разрешение на авторизацию действительно, IdentiryServer4
создаёт access-токен
(токен доступа) для приложения и необязательный ключ обновления (refresh-токен
). Процесс авторизации завершён. Если запрос недопустимый или несанкционированный, то сервер авторизации возвращает код с соответствующим сообщением об ошибке.
Клентское приложение обращается за данными к защищенному Web API, предоставляя при этом токен доступа для авторизации. Если код ответа сервера ресурсов 401 [8], 403 [9] или 498 [10], то токен доступа, используемый для аутентификации, недействителен или просрочен.
Если токен действителен, Web API
предоставляет данные приложению.
Зарегистрированным в IdentityServer4
клиентам позволено запрашивать у IdentityServer4
identity
-токен, access
-токен и refresh
-токен.
Введем еще два понятия:
Authenticatation Server Url — конечная точка для получения ключа доступа. Все запросы на предоставление и возобновление ключей доступа будем направлять на этот URL-адрес.
Resource Url — URL-адрес защищенного ресурса, по которому нужно обращаться, чтобы получить доступ к нему, передавая ему ключ доступа в заголовке авторизации.
Для запроса ключа доступа клиент делает POST
запрос к конечной точке IdentityServer4
со следующим заголовком
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json',
'Expect': '100-continue'
и передавая следующие параметры:
'grant_type' : 'password',
'username' : login,
'password' : password,
'scope' : 'scope',
'client_id' : 'client_id',
'client_secret' : '{client_secret}'
username
, password
, client_id
и client_secret
были разобраны выше. Разберём остальные параметры:
grant_type — тип гранта или тип разрешения на авторизацию. Тип разрешения на авторизацию зависит от используемого приложением метода запроса авторизации, а также от того, какие типы разрешения поддерживаются со стороны API. В нашем случае он будет иметь значение password
, что согласно спецификации OAuth 2.0
соответствует гранту реквизитов доступа владельца ресурса (авторизация по логину и паролю).
Протокол OAuth 2.0
определяет следующие типы грантов требующие обязательного взаимодействие с пользователям:
И типы грантов, которые могут выполняться без интерактивного взаимодействия с пользователям:
OAuth 2.0
.scope — это необязательный параметр. Он определяет область видимости. Токен доступа, возвращенный сервером, будет обеспечивать доступ только к тем службам, которые входят в эту область. Т.е. мы можем несколько служб объединить под одним scope и если клиент получает ключ доступа к этому scope он получает доступ ко всем этим службам. Также scope может использоваться для ограничения прав авторизации (например, доступ на чтение или запись)
Автор: artemmatveev
Источник [11]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/c-2/347393
Ссылки в тексте:
[1] OpenID Connect: https://openid.net/connect/
[2] OAuth 2.0: https://ru.wikipedia.org/wiki/OAuth#OAuth_2.0
[3] IdentityServer4: https://identityserver4.readthedocs.io/en/latest/
[4] UserInfo: http://docs.identityserver.io/en/latest/endpoints/userinfo.html
[5] JWT: https://ru.wikipedia.org/wiki/JSON_Web_Token
[6] OAuth 2.0 (RFC 6749): https://tools.ietf.org/html/rfc6749
[7] Web API: https://docs.microsoft.com/ru-ru/aspnet/core/tutorials/first-web-api?view=aspnetcore-3.1&tabs=visual-studio
[8] 401: https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BA%D0%BE%D0%B4%D0%BE%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F_HTTP#401
[9] 403: https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BA%D0%BE%D0%B4%D0%BE%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F_HTTP#403
[10] 498: https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
[11] Источник: https://habr.com/ru/post/489354/?utm_campaign=489354&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.