Flux de processus de connexion (AuthnRequest)

  • Rversion finale: Yokohama
  • Mis à jour 30 janv. 2025
  • 2 minutes de lecture
  • SAML 2.0 spécifie un profil SSO de navigateur Web qui implique l’échange d’informations entre un fournisseur d’identité (IdP), un fournisseur de service (SP) et un principal (utilisateur) sur un navigateur Web.

    Le fournisseur d’identité peut être n’importe quel service SSO offrant des services d’authentification SAML (par exemple, SSOCircle). Le fournisseur de service est toujours une instance. Le flux de messages commence par une demande de ressource sécurisée auprès du fournisseur de service.

    Demander la ressource cible au SP

    Le principal demande une ressource cible chez le fournisseur de service :

    https://instance.service-now.com/

    L’instance vérifie la demande pour voir si les paramètres d’URL SAMLRequest et RelayState sont présents. S’il existe, l’utilisateur a déjà validé avec l’IdP et peut ignorer les étapes 2 à 6.

    Émettre une demande AuthnRequest au fournisseur d’identité

    L’instance construit une AuthnRequest à envoyer à l’IdP à l’aide de la valeur SAMLRequest . L’instance construit et envoie également une valeur de paramètre d’URL RelayState .

    Le jeton RelayState est une référence opaque à des informations d’état conservées chez le fournisseur de service. La valeur du paramètre SAMLRequest est la valeur dégonflée et codée en base64 de l’élément <samlp :AuthnRequest> :
    <samlp:AuthnRequest    xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"    ID="identifier_1"    Version="2.0"    IssueInstant="2004-12-05T09:21:59Z"    AssertionConsumerServiceIndex="0"><saml:Issuer>https://sp.example.com/SAML2</saml:Issuer><samlp:NameIDPolicy      AllowCreate="true"      Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/></samlp:AuthnRequest>

    L’intégration code ensuite l’URL de l’élément <samlp :AuthnRequest> et l’envoie en tant que paramètre d’URL SAMLRequest .

    Le service SSO traite l’élément <samlp :AuthnRequest> en décodant l’URL, en décodant base64 et en gonflant la demande, dans cet ordre. Il effectue ensuite un contrôle de sécurité. Si l’utilisateur ne dispose pas d’un contexte de sécurité valide, l’IdP l’identifie en l’invitant à saisir ses identifiants de connexion. Si l’utilisateur est déjà connecté, l’IdP répond simplement avec les paramètres d’URL SAMLResponse<tt> et <tt>RelayState (voir étape 3).

    Répondre avec SAMLResponse et RelayState

    Après avoir collecté les informations d’identification de connexion requises, le service SSO valide la demande et répond avec un document contenant un formulaire XHTML :
    <formmethod="post"action="https://instance.service-now.com/navpage.do" ...><input type="hidden" name="SAMLResponse" value="response ..." /><input type="hidden" name="RelayState" value="token ..." />
        ...
        <input type="submit" value="Submit" /></form>
    La valeur du paramètre RelayState provient de cette étape. La valeur du paramètre SAMLResponse est le codage base64 de l’élément <samlp :Response> suivant :
    <samlp:Responsexmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"  ID="s2cdc74f37f923e26fe1aeec42b70a93d24230334f"  InResponseTo="90AA6073F01567BFB0DF194F596314E2"  Version="2.0"  IssueInstant="2010-04-29T23:21:51Z"  Destination="https://dloomac.service-now.com/navpage.do"><saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">http://idp.ssocircle.com</saml:Issuer><samlp:Status xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"><samlp:StatusCode xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"       Value="urn:oasis:names:tc:SAML:2.0:status:Success"></samlp:StatusCode></samlp:Status><saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"    ID="s23e536bfc51b8487d4d3299dec162d9c2e338823b"    IssueInstant="2010-04-29T23:21:51Z"    Version="2.0"><saml:Issuer>http://idp.ssocircle.com</saml:Issuer><Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
     
    ...
          </Signature><saml:Subject><saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"            NameQualifier="http://idp.ssocircle.com"             SPNameQualifier="https://dloomac.service-now.com/navpage.do">david.loo@service-now.com</saml:NameID><saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"><saml:SubjectConfirmationData              InResponseTo="90AA6073F01567BFB0DF194F596314E2"              NotOnOrAfter="2010-04-29T23:31:51Z"              Recipient="https://dloomac.service-now.com/navpage.do" /></saml:SubjectConfirmation></saml:Subject><saml:Conditions NotBefore="2010-04-29T23:11:51Z"        NotOnOrAfter="2010-04-29T23:31:51Z"><saml:AudienceRestriction><saml:Audience>https://dloomac.service-now.com</saml:Audience></saml:AudienceRestriction></saml:Conditions><saml:AuthnStatement AuthnInstant="2010-04-29T23:21:51Z"        SessionIndex="s2dbf89ab99001e0e8cdaed67266d9d4b21b968a04"><saml:AuthnContext><saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef></saml:AuthnContext></saml:AuthnStatement></saml:Assertion></samlp:Response>

    Valider la réponse SAML

    La valeur SAMLResponse est décodée en base64 et gonflée pour révéler le document XML à l’étape 3. Le script de connexion extrait la valeur XML de l’élément Subject/NameID et l’utilise pour rechercher un utilisateur existant dans la table Utilisateur.

    Le script de connexion extrait également l’ID de session de l’élément AuthnStatement/@SessionIndex et le stocke pour LogoutRequest.