SSO (Single Sign-On) — технология единого входа, благодаря которой пользователи могут авторизоваться в нескольких приложениях с помощью одного набора учетных данных. |
---|
Security Assertion Markup Language (SAML) — открытый стандарт передачи идентификационных данных между облачными системами. Как правило, его используют в больших организациях, где есть актуальная база пользователей, работают политики безопасности и т. п., что делает доступ к контенту в сервисе более безопасным и контролируемым. |
---|
ADFS (Active Directory Federation Services) — компонент Windows Server, обеспечивающий функционал провайдера аутентификации для веб-приложений. ADFS расширяет возможности использования технологии единого входа, доступной в пределах одной границы безопасности или организации, в веб-приложениях. Службы ADFS тесно интегрированы с Active Directory. ADFS извлекает атрибуты пользователей из Active Directory, а также проверяет подлинность пользователей в этой системе. |
---|
Настройка SP
Identity Provider (IDP) — поставщик удостоверений, приложение, реализующее SAML-протокол, аутентифицирующее пользователей |
---|
Service Provider (SP) — провайдер услуг, приложение, предоставляющее сервис аутентифированному у Identity Provider пользователю (в нашем случае — приложение "Первая Форма") |
---|
1. Сгенерировать сертификат для подписания запросов SP —> IDP
Сертификат представляет собой запароленный .pfx-файл, содержащий публичный и приватный ключи.
При выполнении запросов SP —> IDP этот файл читается приложением Первой формы, и запрос подписывается этими ключами. Файл следует поместить на сервере 1F.
Публичный ключ этого сертификата (отдельный .cer-файл, сгенерированный вместе с .pfx-файлом) нужно предоставить администратору IDP, и установить его на IDP-сервере как корневой сертификат (необходимо для валидации подписи запроса).
2. Установить сертификат для валидации запросов IDP —> SP
Сертификат (публичный ключ) можно получить у админа IDP, и установить его на 1F-сервере как корневой.
Настройка "Первой Формы"
1. Добавить сервис SAML в Провайдеры аутентификации.
2. Создать провайдер аутентификации на базе этого сервиса. Описание параметров настроек сервиса SAML вы найдете в соответствующем разделе.
3. После создания провайдера аутентификации в приложении 1F по адресу /api/auth/saml/{providerId}/metadata станут доступны метаданные-SP.
Метаданные — XML-файл с описанием и основными параметры конфигурации. Метаданные есть и у SP и у IDP. |
---|
Этот файл следует передать администратору IDP.
В нем указаны:
•AssertionConsumerService — эндпоинт для приема ответов аутентификации от IDP (/api/auth/saml/{providerId}/assertionconsumer)
•SingleLogoutService — эндпоинт для приема ответов разлогина от IDP (/api/auth/saml/{providerId}/singlelogout)
Метаданные
Настройка IDP
Выполняется администратором IDP. Важные шаги:
1. Получить от SP файл с метаданными-SP (/api/auth/saml/{providerId}/metadata), и создать конфигурацию
2. На сервере IDP установить сертификат (публичный ключ) из п1 "Настройка SP" как корневой.
3. Настроить отдачу необходимых claims в ответе аутентификации (в нашем случае для ADFS — primarySid)
4. Предоставить ссылку на файл метаданных-IDP администратору SP.
В метаданных IDP описаны параметры — эндпоинты для приема запросов логина/логаута, протокол общения, публичные ключи сертификатов.
•SingleSignOnService — эндпоинт для приема запросов аутентификации от SP
•SingleLogoutService — эндпоинт для приема запросов разлогина от SP
Как работает SAML в приложении 1F
Вся коммуникация между SP и IDP происходит через браузер — SAML основан на HTTP-запросах и браузерных переадресациях |
---|
Логин
•В файле app-settings.json указан настроенный SAML-провайдер со свойством:
{
"Settings": {
"LoginPath": "/api/auth/saml/{providerId}/login",
"LogoutPath": "/api/auth/saml/{providerId}/logout"
},
"ProviderType": "SAML",
"Name": "1forma.net (ADFS)",
"Id": {providerId}
}
•SPA приложение отрисует кнопку логина через этот провайдер.
•При клике на кнопку SPA переходит по ссылке LoginPath (/api/auth/saml/{providerId}/login),
•1F формирует запрос аутентификации и подписывает сертификатом, указанным в конфигурации (SignCertificatePath)
•Запрос отправляется в браузер, и происходит переадресация на SingleSignOnService URL (указано в метаданных IDP)
•Пользователь аутентифицируется, и IDP формирует ответ аутентификации, и перенаправляет пользователя на AssertionConsumerService (указан в метаданных SP)
•1F в методе /api/auth/saml/{providerId}/assertionconsumer валидирует подпись ответа, считывает claim с именем UserClaimName
•1F ищет пользователя с SID=claim.Value
•1F генерирует стандартный JWT-токен, и зашивает в него 3 дополнительных claims:
oProviderId — id провайдера аутентификации
oNameId — необходим для разлогина
oSessionIndex — необходим для разлогина на сервере IDP
•Время жизни токена определяется параметром SecurityTokenValidTo из ответа IDP.
Выход
•При разлогине SPA приложение считывает из токена ProviderId, и из app-settings.json LogoutPath для этого провайдера
•SPA переходит по ссылке LogoutPath
•1F формирует запрос разлогина, и переадресовывает на SingleLogoutService URL (указано в метаданных IDP)
•IDP удаляет сессию пользователя, и переадресовывает обратно на SingleLogoutService (указано в метаданных SP)
•1F удаляет cookie и токен
•Пользователь разлогинен в 1F
Полезные ссылки