Tools4ever Tech Blog

SAML, hoe werkt het?

Robbert Brussaard - Software Engineer | 22 maart 2016

In het vorige blog-bericht heb ik verteld dat wij aan HelloID werken, ons Single-Sign On product, en dat SAML hier een belangrijk onderdeel van is. Ook heb ik globaal uitgelegd wat SAML is en wat het doet.

In dit blog gaan we in op de techniek dat de communicatie verzorgt. Ik ga dezelfde flow gebruiken die ik eerder (in het vorige blog-bericht over SAML) heb gebruikt, maar nu zal ik per stap uit leggen wat er 'onder water' gebeurt. Als je het vorige blog-bericht nog niet hebt gelezen, raad ik je aan dat te doen.

Hoe werkt het?

Door middel van het toepassen van SAML kan beveiligingsinformatie worden uitgewisseld met andere systemen, deze informatie-uitwisseling gaat via een communicatieprotocol dat bij de standaard van SAML hoort. Hieronder heb ik opnieuw de IDP-initiated flow opgenomen, maar nu heb ik per stap toegelicht wat er 'onder water' gebeurt om SAML te faciliteren. Deze techniek start bij stap 4.

Meer weten over de SAML-standaarden? Kijk dan hier.

De flow in het kort
De gebruiker logt in op het HelloID-portaal (IdP) van Tools4ever. HelloID toont de gebruiker een overzicht van applicaties. De gebruiker klikt op Zendesk (SP) en is zonder tussenkomst van een inlog-pagina ingelogd bij Zendesk.

De flow stap per stap beschreven

  1. De gebruiker logt in op het HelloID-portaal (Identity provider, IdP). In dit geval met een gebruikersnaam en wachtwoord combinatie;
  2. HelloID toont de gebruiker een overzicht van applicaties;
  3. De gebruiker klikt op Zendesk (Service provider, SP);
  4. HelloID maakt als IdP een SAML-bericht om een authenticatie uit te voeren bij de SP. HelloID ondertekent en/of versleutelt het bericht door middel van een certificaat;

HelloID genereert o.b.v. de SAML-standaarden een SAML-bericht dat de SP verwacht. Dit bericht wordt opgemaakt als een XML-bericht, zie hier een voorbeeld:

Indien is ingesteld dat het bericht moet worden ondertekent dan doet HelloID dit met een x509 certificaat. In het kort betekent dit ondertekenen: op basis van het bericht wordt een hash gecreëerd, vervolgens wordt deze hash versleuteld (doormiddel van een asymmetrisch algoritme, bijvoorbeeld RSA) met de private key van het certificaat. Nu wordt het versleutelde bericht ge-encodeerd naar base64 en als een nieuw XML-element toegevoegd aan het bovenstaande bericht. Zie hieronder een voorbeeld van het nieuwe XML-element.

5. Het bericht wordt verstuurd naar de SP endpoint (Assertion consumer service, ACS);

Het XML-bericht verstuurt HelloID door middel van HTTP-Post naar de SP. Dit gebeurt in de volgende stappen:

  • Het XML-bericht wordt ge-encodeerd naar Base64;
  • Het ge-encodeerde bericht wordt door HelloID ook ge-encodeerd met HTML codes;
  • Een pagina met een HTML-formulier wordt opgebouwd met hierin één input veld 'SAMLResponse', de waarde dat dit veld bevat is het ge-encodeerde XML-bericht;
  • Om de gebruiker van gemak te voorzien, is een klein stuk javascript toegevoegd dat direct het formulier verzendt naar de SP.

Voorbeeld van bovenstaand genoemd HTML-formulier:

6. SP ontvangt het bericht en valideert deze aan de hand van een certificaat, dit moet overeenkomen met hetzelfde certificaat als dat in ons systeem staat ingesteld en wat als onderdeel van de initiële configuratie is ingesteld. (De systemen moeten elkaar kunnen vertrouwen). SP maakt een sessie voor de gebruiker aan in haar systeem, mits het ons bericht vertrouwd. Het is aan de SP hoe zij met verdere afhandeling omgaat zoals: controle voor autorisaties, Just-in-time provisioning en controle of het van het juiste adres afkomstig is e.d.;

De SP decodeert het bericht en zal de ondertekening van het bericht verifiëren aan de hand van de public key van het certificaat dat hier is ingesteld. Indien alles is goed gekeurd, de gebruiker bestaat of wordt aangemaakt dan is gebruiker ingelogd.

7. De gebruiker is zonder tussenkomst van een inlog-pagina ingelogd bij Zendesk (SP).

Uiteraard dekt dit nog niet alles, maar wel in basis hoe de communicatie tussen IdP en SP werkt. In toekomstige berichten over SAML zal ik verder ingaan op de standaarden van SAML, hoe SP-initiated werkt en ook wat uitdagingen zijn bij het implementeren van SAML.