Как работает SAML 2.0 — основы для инженера Принтум
Как работает SAML 2.0 — основы для инженера Принтум
Назначение
SAML 2.0 (Security Assertion Markup Language) — стандарт обмена данными аутентификации и авторизации между IdP и SP на основе XML (OASIS, 2005).
Основные роли
| Роль | Описание | Пример |
|---|---|---|
| IdP (Identity Provider) | Аутентифицирует пользователя и выдаёт assertions | ADFS, Keycloak, Okta, Azure AD |
| SP (Service Provider) | Принимает assertions и предоставляет доступ | Принтум, веб-приложение |
| Пользователь (User Agent) | Браузер, который перенаправляется между IdP и SP | Браузер пользователя |
Типы assertions
| Тип | Содержимое |
|---|---|
| Authentication assertion | Кто пользователь, когда и как аутентифицирован |
| Attribute assertion | Атрибуты пользователя (email, группы, роль) |
| Authorization assertion | Права доступа (используется редко) |
SP-initiated flow (наиболее распространён)
1. Пользователь → SP: обращается к защищённому ресурсу
2. SP → Браузер: HTTP 302, AuthnRequest (SAML Request)
3. Браузер → IdP: перенаправление с AuthnRequest
4. IdP → Пользователь: форма входа (если нет сессии)
5. IdP → Браузер: HTTP 200 + форма с SAML Response (POST binding)
6. Браузер → SP: POST с SAML Response (assertion)
7. SP → Пользователь: доступ разрешён
Bindings
| Binding | Механизм передачи |
|---|---|
| HTTP Redirect | AuthnRequest передаётся в URL (GET), подписывается query string |
| HTTP POST | Response передаётся в теле формы (Base64-encoded XML) |
| HTTP Artifact | Ссылка на assertion; SP забирает напрямую у IdP |
Безопасность
- Assertions подписываются IdP с помощью X.509-сертификата.
- SP проверяет подпись перед обработкой.
- Assertion содержит
NotBeforeиNotOnOrAfter— временное окно действия. - Для защиты от replay-атак используется
InResponseToи однократное использование assertion ID.
Связь с SSO в Принтум
Принтум (в роли SP) может принять аутентификацию от корпоративного IdP по SAML 2.0. Пользователь, уже вошедший в корпоративный IdP, получает доступ к Личному кабинету без ввода пароля.
TODO: уточнить — какие атрибуты assertion Принтум использует для сопоставления пользователя (NameID, email, UPN).