Flux de processus de connexion (AuthnRequest)

  • Rversion finale: Washingtondc
  • Mis à jour 1 févr. 2024
  • 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 niveau du portail de services

    Le principal demande une ressource cible auprès du 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’ils existent, l’utilisateur a déjà validé avec l’IdP et peut ignorer les étapes 2 à 6.

    Problème 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 URL RelayState .

    Le jeton RelayState est une référence opaque aux informations d’état conservées chez le fournisseur de services. La valeur du paramètre SAMLRequest est la valeur déflatée et codée 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 encode ensuite l’élément &lt;samlp :AuthnRequest> et l’envoie comme paramètre d’URL SAMLRequest .

    Le service SSO traite l’élément &lt;samlp :AuthnRequest> en procédant au décodage d’URL, au décodage 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 identifie l’utilisateur en le demandant ses informations d’identification 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 l’étape 3).

    Répondre avec une réponse SAML 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 &lt;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 SAMLResponse

    La valeur de la réponse SAML est décodée et gonflée en base64 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 la LogoutRequest.