Lab · 03 / 16
Due modi per dire sono io.
In azienda li incontri entrambi ogni giorno. SAML regge gran parte del single sign-on web aziendale degli ultimi vent’anni, OpenID Connect è la scelta di default per tutto ciò che è nuovo, soprattutto app mobile e API.
In parole semplici Entrambi sono una lettera firmata dall’IdP che dice "questa è Ada". SAML la scrive in XML e la consegna passando dal browser; OIDC la scrive come token JSON compatto e dà all’app anche una chiave per le API.
| SAML 2.0asserzioni XML | OpenID Connecttoken JSON | |
|---|---|---|
| Nascita | 2005, OASIS | 2014, OpenID Foundation |
| Formato | Asserzione XML, firma XML | JWT (JSON), firma JWS |
| Ruoli | Identity provider e service provider | OpenID provider e relying party (client) |
| Trasporto | Redirect del browser e form POST inviati in automatico | Redirect più chiamate dirette all’endpoint token |
| Mobile e SPA | Scomodo, pensato per il browser | Nativo, con PKCE |
| Chiamare API | Non previsto, serve un altro protocollo | Access token dallo stesso flusso |
| Configurazione | Scambio di metadata XML e certificati | URL di discovery e rotazione automatica delle chiavi (JWKS) |
| Dove lo trovi | SaaS aziendali, portali legacy, pubblica amministrazione | App nuove, mobile, login dei clienti, API |
Quando usare SAML 2.0
Usa SAML quando l’app supporta solo SAML, cosa ancora frequente nei SaaS aziendali. È maturo e ben conosciuto dagli auditor.
Quando usare OpenID Connect
Usa OpenID Connect per ogni nuova app che sviluppi, e per mobile, single-page app e tutto ciò che chiama API.
L’errore più comune
Fidarsi di una risposta SAML senza controlli rigorosi. Il service provider deve verificare la firma sull’asserzione stessa e controllare Audience, Recipient, finestra temporale e che l’elemento firmato sia proprio quello che legge. Una gestione debole della firma XML ha causato violazioni reali.
A confronto
<saml:Assertion ID="_a75adf55" IssueInstant="2026-10-19T08:00:00Z">
<saml:Issuer>https://idp.example.com</saml:Issuer>
<ds:Signature>…</ds:Signature>
<saml:Subject>
<saml:NameID>ada@example.com</saml:NameID>
</saml:Subject>
<saml:Conditions NotOnOrAfter="2026-10-19T08:05:00Z">
<saml:Audience>https://app.example.com</saml:Audience>
</saml:Conditions>
</saml:Assertion>{
"iss": "https://idp.example.com",
"sub": "248289761001",
"aud": "web-app",
"iat": 1760860800,
"exp": 1760861100,
"email": "ada@example.com"
}
// signed with a key published at
// /.well-known/jwks.json