Fluxo do processo de login (AuthnRequest)
O SAML 2.0 especifica um perfil de SSO do navegador da Web que envolve a troca de informações entre um provedor de identidade (IdP), um provedor de serviço (SP) e uma entidade de segurança (usuário) em um navegador da Web.
O provedor de identidade pode ser qualquer serviço SSO que ofereça serviços de autenticação SAML (por exemplo, SSOCircle). O provedor de serviço é sempre uma instância. O fluxo de mensagens começa com uma solicitação de um recurso protegido no provedor de serviço.
Como solicite o recurso de destino no SP
A entidade de segurança solicita um recurso de destino no provedor de serviço:
https://instance.service-now.com/
A instância verifica a solicitação para ver se os parâmetros de URL "SAMLRequest" e "RelayState" estão presentes. Se eles existirem, o usuário já foi validado com o IdP e pode ignorar as etapas 2 a 6.
Como emitir um AuthnRequest para o provedor de identidade
A instância constrói um AuthnRequest a ser enviado ao IdP usando o valor SAMLRequest. A instância também constrói e envia um valor de parâmetro de URL RelayState.
RelayState é uma referência opaca às informações de estado mantidas no provedor de serviço. O valor do parâmetro SAMLRequest é o valor deflacionado e codificado em base64 do elemento <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>A integração codifica por URL o elemento <samlp:AuthnRequest> e o envia como o parâmetro de URL SAMLRequest
O serviço de SSO processa o elemento <samlp:AuthnRequest> por decodificação de URL, decodificação base64 e aumento da solicitação, nessa ordem. Em seguida, ele executa uma verificação de segurança. Se o usuário não tiver um contexto de segurança válido, o IdP identificará o usuário solicitando credenciais de login. Se o usuário já estiver conectado, o IdP simplesmente responderá com os parâmetros de URL SAMLResponse<tt> e <tt>RelayState (consulte a etapa 3).
Como responder com um SAMLResponse e RelayState
<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>RelayState vem desta etapa. O valor do parâmetro SAMLResponse é a codificação em base64 do seguinte elemento <samlp:Response>:<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>Como validar o SAMLResponse
O valor SAMLResponse é decodificado em base64 e aumentado para revelar o documento XML na etapa 3. O script de login extrai o valor XML do elemento //Subject/NameID e o usa para pesquisar um usuário existente na tabela Usuário.
O script de login também extrai o ID da sessão do elemento //AuthnStatement/@SessionIndex e o armazena para o LogoutRequest.