SAML
SAML 2.0 (Security Assertion Markup Language) — XML-based стандарт SSO. Старше OIDC, всё ещё стандарт в enterprise (banking, healthcare, universities).
Роли
- IdP (Identity Provider) — Okta, ADFS, PingFederate, Keycloak, Google Workspace
- SP (Service Provider) — приложение
- User Agent — браузер юзера
Flow (SP-initiated)
1. User → SP: GET /app
2. SP → User: 302 IdP/SSO?SAMLRequest=...
3. User → IdP: логинится
4. IdP → User: HTML с автосабмит формой на SP/ACS
5. Browser → SP: POST /acs SAMLResponse=<signed XML>
6. SP валидирует, создаёт локальную сессию
SAML Assertion
<saml:Assertion>
<saml:Issuer>https://idp.com</saml:Issuer>
<saml:Subject>
<saml:NameID>user@example.com</saml:NameID>
</saml:Subject>
<saml:Conditions NotBefore="..." NotOnOrAfter="...">
<saml:AudienceRestriction>
<saml:Audience>https://sp.com</saml:Audience>
</saml:AudienceRestriction>
</saml:Conditions>
<saml:AttributeStatement>
<saml:Attribute Name="email">user@example.com</saml:Attribute>
<saml:Attribute Name="groups">admins,eng</saml:Attribute>
</saml:AttributeStatement>
<ds:Signature>...</ds:Signature>
</saml:Assertion>
Bindings
- HTTP Redirect — GET с сжатым SAMLRequest в query
- HTTP POST — форма (для больших ответов)
- HTTP Artifact — SP запрашивает assertion по artifact-у (редко)
SAML vs OIDC
| SAML | OIDC | |
|---|---|---|
| Формат | XML | JSON |
| Год | 2005 | 2014 |
| Для mobile/SPA | плохо | отлично |
| Enterprise | де-факто | догоняет |
| Подпись | XML-DSig (сложно, XSW-атаки) | JWS |
XML Signature Wrapping
Классическая атака на SAML — переставить подписанный/неподписанный элемент так, чтобы валидатор проверил один, а использовал другой. Многие SP уязвимы, если реализация кривая.