SAML

SAML 2.0 (Security Assertion Markup Language) — XML-based стандарт SSO. Старше OIDC, всё ещё стандарт в enterprise (banking, healthcare, universities).

Роли

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

SAML vs OIDC

SAMLOIDC
ФорматXMLJSON
Год20052014
Для mobile/SPAплохоотлично
Enterpriseде-фактодогоняет
ПодписьXML-DSig (сложно, XSW-атаки)JWS

XML Signature Wrapping

Классическая атака на SAML — переставить подписанный/неподписанный элемент так, чтобы валидатор проверил один, а использовал другой. Многие SP уязвимы, если реализация кривая.

См. также