En este segundo artículo de la serie Aprendiendo WSO2 Identity Server vamos a profundizar en el intercambio de mensajes que se dan entre un Service Provider (SP) y un Identity Provider (IdP) para establecer una sesión válida en un sistema Single Sign-On (Web SSO). De igual forma veremos cómo se invalida dicha sesión y, finalmente, mostraremos la diferencias entre iniciar una sesión SSO desde el SP o desde el IdP que en este caso es WSO2 Identity Server (IS).
Este post parte del ejemplo desarrollado en la primera parte de esta serie de artículos Aprendiendo WSO2 Identity Server (I): Single Sign-On.
El ejemplo se basa en la configuración de dos aplicaciones web (Travelocity y Avis) como Service Providers en WSO2 Identity Server manteniendo ambas una relación de confianza con el IdP. Esta relación les permite establecer un procedimiento de autenticación basado en Single Sign-On por el cual un usuario podrá logarse en las dos aplicaciones con una única identidad facilitando sus credenciales una única vez.
Analizando el flujo de mensajes en un escenario SSO
En este apartado vamos a analizar el intercambio de mensajes SAML que se produce en el ejemplo con el que estamos trabajando.
SP initiated SSO (Redirect Binding)
El flujo se inicia en la aplicación web Travelocity cuya página de inicio es accesible mediante:
http://localhost:9080/travelocity.com/index.jsp
Y se pulsa la opción Click here to login with SAML (Redirect Binding) from WSO2 Identity Server:
En este momento la aplicación Travelocity (SP1) inicial el intercambio SAML redireccionando al usuario al servidor WSO2 IS (IdP), este recibe la petición y el navegador muestra al usuario (User Agent) la pantalla de login del IdP:
En este caso la petición SAMLRequest es enviada por la aplicación web (SP1) mediante un GET redirect binding (deflate y encode) . La firma es incluida en un parámetro de petición diferente.
La petición GET, con los query string SAMLRequest, SigAlg y Signature, es la siguiente:
https://localhost:9443/samlsso?SAMLRequest=nZNPj9owEMXv%2FRSR7%2BQfq4q1SFYUtCrStqLA9tCbcSYbs46dehxgv33tBLZR1SJUKZfYM7%2BZvPcyfTjVMjiAQaFVRpIwJgEorguhXjLyvH0cTchD%2FmGKrJYNnbW2Umv42QLaYIYIxrq2uVbY1mA2YA6Cw%2FP6KSOVtQ2NoiPqVGAoNWeS3seTOLKGHcC9C%2FsWcl1Hla4h3GNDgoWDCsVst4jvRwfoOiuNlt7f3Y0jvwaiJsGjNhy6dTJSMolAguUiI6%2Bs1FVdQMlVIUoo2e6lKV9VxcWu2BcKuIKq3FcOsMQVQxQH%2BN2P2MJSoWXKZiSNk8koSdyzTRI6jul4En5Mxj9IsDLaaq7lJ6F6lVqjqGYokCpWA1LL6Wb25YmmYUx3fRHSz9vtarSGQhjglgTfL4qnXnHngULaaXwd15xnk%2FzsSLe0uR3ALqaR%2FA8nptGQ2PPThn51iOVipaXgb8FMSn2cG2DWyWZNC50RNbPXh%2FoTUYzKrpQ2%2FtPRgnIybFae%2F61lUpQCTEb66UNF0lslid53PicUii4gLp4WTjaY67phRqBXHU7Mu%2FAfU%2FohdEieS6fqGsoB7mYTrpZxyj3aHfusHrUpfPZcfqDYGqaw0cb2tv11n7y%2F%2B5cg%2BcXx4V%2Bd%2FwI%3D&SigAlg=http%3A%2F%2Fwww.w3.org%2F2000%2F09%2Fxmldsig%23rsa-sha1&Signature=XXg2Uf5Mctp1BjJHOn1i8EyQK6V1yWulcSOCNP8c5gZmi%2FYrtBgwehA5zEktnxti7DH0WLC4e9UXoRst27%2FugrEFjvjkZijDvBxEOztNNqk8vKEGE6GA8adSPUot7qQOdOtJuFci2gcwClQR3ssnF82jmOz%2F85l8SeIkfT2gN9A%3D
El parámetro SAMLRequest tiene el siguiente valor:
<?xml version="1.0" encoding="UTF-8"?>
<samlp:AuthnRequest AssertionConsumerServiceURL="http://wso2is.local:9080/travelocity.com/home.jsp"
Destination="https://localhost:9443/samlsso"
ForceAuthn="false"
ID="kafohmdefcndifefabgpfknhcibdjdnecnehfjho"
IsPassive="false"
IssueInstant="2018-11-11T11:30:38.613Z"
ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
Version="2.0"
xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
<samlp:Issuer xmlns:samlp="urn:oasis:names:tc:SAML:2.0:assertion">travelocity.com</samlp:Issuer>
<saml2p:NameIDPolicy AllowCreate="true"
Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
SPNameQualifier="Issuer"
xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" />
<saml2p:RequestedAuthnContext Comparison="exact"
xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol">
<saml:AuthnContextClassRef xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef>
</saml2p:RequestedAuthnContext>
</samlp:AuthnRequest>
En la página de login se introducen las credenciales correctas del usuario, en este caso las de Pedro, y vemos como se produce la autenticación y se accede a la página protegida home. En esta página se muestran los atributos del usuario correspondientes a los claims indicados en la configuración del Service Provider en el Identity Server.
La respuesta SAML enviada mediante POST binding por el IdP está dirigida a la Assertion Consumer URL del Service Provider http://wso2is.local:9080/travelocity.com/home.jsp. El XML correspondiente a esta respuesta es:
<?xml version="1.0" encoding="UTF-8"?>
<saml2p:Response Destination="http://wso2is.local:9080/travelocity.com/home.jsp"
ID="_f62aba6321a48e054600f87cb1fdb01a"
InResponseTo="kafohmdefcndifefabgpfknhcibdjdnecnehfjho"
IssueInstant="2018-11-11T11:32:42.214Z"
Version="2.0"
xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity"
xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">localhost</saml2:Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<ds:Reference URI="#_f62aba6321a48e054600f87cb1fdb01a">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces PrefixList="xs"
xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" />
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<ds:DigestValue>eJdZq7Uxlf4cMd4sNRG1Gh2uBfw=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
QQf7BJbpFC0fjIArieCmCN7xK2kUa68Uz9HK474fUcKB6idbXnk3NC9HWil8NleQmAuEGEXQaplJ ks4Ws6NmBYe+1fNZXjkqaVk0IZLTySPaS+Hk4//oY86Imjn28uKvCXWqPvE8c6OF4aphT9scEWIt n+13UfHQa8Y1HTt/kIA=
</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>
MIICNTCCAZ6gAwIBAgIES343gjANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJVUzELMAkGA1UE CAwCQ0ExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxDTALBgNVBAoMBFdTTzIxEjAQBgNVBAMMCWxv Y2FsaG9zdDAeFw0xMDAyMTkwNzAyMjZaFw0zNTAyMTMwNzAyMjZaMFUxCzAJBgNVBAYTAlVTMQsw CQYDVQQIDAJDQTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzENMAsGA1UECgwEV1NPMjESMBAGA1UE
AwwJbG9jYWxob3N0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCUp/oV1vWc8/TkQSiAvTou sMzOM4asB2iltr2QKozni5aVFu818MpOLZIr8LMnTzWllJvvaA5RAAdpbECb+48FjbBe0hseUdN5 HpwvnH/DW8ZccGvk53I6Orq7hLCv1ZHtuOCokghz/ATrhyPq+QktMfXnRS4HrKGJTzxaCcU7OQID AQABoxIwEDAOBgNVHQ8BAf8EBAMCBPAwDQYJKoZIhvcNAQEFBQADgYEAW5wPR7cr1LAdq+IrR44i
QlRG5ITCZXY9hI0PygLP2rHANh+PYfTmxbuOnykNGyhM6FjFLbW2uZHQTY1jMrPprjOrmyK5sjJR O4d1DeGHT/YnIjs9JogRKv4XHECwLtIVdAbIdWHEtVZJyMSktcyysFcvuhPQK8Qc/E/Wq8uHSCo=
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
<saml2p:Status>
<saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" /></saml2p:Status>
<saml2:Assertion ID="_69e3d7d993df16feda64ae6c1f709153"
IssueInstant="2018-11-11T11:32:42.216Z"
Version="2.0"
xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">localhost</saml2:Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<ds:Reference URI="#_69e3d7d993df16feda64ae6c1f709153">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces PrefixList="xs"
xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" />
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<ds:DigestValue>jDtggS4aPV6NDhItvQq2igjCXmY=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
AnsUoSRCk8aTyqvcKIBDVUS/60xkVUcb0dYOd3FTRGTtYZa5XKwJYBzTp8EF+joImRJEZ/gW/3+E rUL6EpXWMkjWvMxhaWEvX7fwLHlbGufqoKnvF/3mZZbRBs0untFW5hBzgyBKcEISuHIud2iXeu+n NuqWtEIVMZio0Rfyi+s=
</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>
MIICNTCCAZ6gAwIBAgIES343gjANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJVUzELMAkGA1UE CAwCQ0ExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxDTALBgNVBAoMBFdTTzIxEjAQBgNVBAMMCWxv Y2FsaG9zdDAeFw0xMDAyMTkwNzAyMjZaFw0zNTAyMTMwNzAyMjZaMFUxCzAJBgNVBAYTAlVTMQsw CQYDVQQIDAJDQTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzENMAsGA1UECgwEV1NPMjESMBAGA1UE
AwwJbG9jYWxob3N0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCUp/oV1vWc8/TkQSiAvTou sMzOM4asB2iltr2QKozni5aVFu818MpOLZIr8LMnTzWllJvvaA5RAAdpbECb+48FjbBe0hseUdN5 HpwvnH/DW8ZccGvk53I6Orq7hLCv1ZHtuOCokghz/ATrhyPq+QktMfXnRS4HrKGJTzxaCcU7OQID AQABoxIwEDAOBgNVHQ8BAf8EBAMCBPAwDQYJKoZIhvcNAQEFBQADgYEAW5wPR7cr1LAdq+IrR44i
QlRG5ITCZXY9hI0PygLP2rHANh+PYfTmxbuOnykNGyhM6FjFLbW2uZHQTY1jMrPprjOrmyK5sjJR O4d1DeGHT/YnIjs9JogRKv4XHECwLtIVdAbIdWHEtVZJyMSktcyysFcvuhPQK8Qc/E/Wq8uHSCo=
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
<saml2:Subject>
<saml2:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">pedro@employee.com</saml2:NameID>
<saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
<saml2:SubjectConfirmationData InResponseTo="kafohmdefcndifefabgpfknhcibdjdnecnehfjho"
NotOnOrAfter="2018-11-11T11:37:42.214Z"
Recipient="http://wso2is.local:9080/travelocity.com/home.jsp" /></saml2:SubjectConfirmation>
</saml2:Subject>
<saml2:Conditions NotBefore="2018-11-11T11:32:42.216Z"
NotOnOrAfter="2018-11-11T11:37:42.214Z">
<saml2:AudienceRestriction>
<saml2:Audience>travelocity.com</saml2:Audience>
</saml2:AudienceRestriction>
</saml2:Conditions>
<saml2:AuthnStatement AuthnInstant="2018-11-11T11:32:42.228Z"
SessionIndex="8ea00e28-68da-46ba-93e4-1203b3d797c0">
<saml2:AuthnContext>
<saml2:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</saml2:AuthnContextClassRef>
</saml2:AuthnContext>
</saml2:AuthnStatement>
<saml2:AttributeStatement>
<saml2:Attribute Name="http://wso2.org/claims/role"
NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
<saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="xs:string">EMPLOYEES/employee</saml2:AttributeValue>
<saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="xs:string">Internal/everyone</saml2:AttributeValue>
</saml2:Attribute>
<saml2:Attribute Name="http://wso2.org/claims/displayName"
NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
<saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="xs:string">Pedro Perez</saml2:AttributeValue>
</saml2:Attribute>
<saml2:Attribute Name="http://wso2.org/claims/mobile"
NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
<saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="xs:string">777777777</saml2:AttributeValue>
</saml2:Attribute>
</saml2:AttributeStatement>
</saml2:Assertion>
</saml2p:Response>
En la respuesta SAML podemos ver en otras cosas la firma realizada, el certificado utilizado, el método de autenticación y los atributos del usuario.
Para comprobar que ambas aplicaciones permiten a Pedro acceder con la misma identidad solicitándole una única vez las credenciales vamos a abrir la aplicación Avis en otra pestaña del navegador:
http://wso2is.local:9080/avis.com/index.jsp
Ahora seleccionamos cualquiera de los dos enlaces que comienzan por Click here to login with SAML.... En este caso podemos ver cómo no se muestra la pantalla de login y el usuario Pedro aparece como autenticado directamente en Avis, esto se debe a que ya teníamos una sesión abierta en el IdP con Travelocity y Avis la utiliza.
Logout (HTTP Redirect Binding)
Para cerrar la sesión se presiona en en el enlace Logout (HTTPRedirect) de la aplicación Travelocity, esto va a iniciar el flujo de Logout con la siguiente petición GET con los parámetros (query string) SAMLRequest, SigAlg y Signature:
https://localhost:9443/samlsso?SAMLRequest=nZJfS8MwFMXf%2FRQl792arrourNXBGAz8A2764FuW3G4ZaW7NzUS%2Fve3mdCr4IIQ8XM79cc7hji9faxu9gCeDrmC8l7AInEJt3LpgD8tZnLPL8mxMsrZpI65xjbtwD887oBBN2884GfarmxAaEv2%2BRSXtBimIUZYN%2Bt0iEbJoPi2Yg5Wu1NaAcqt1vbG1MtoZq922ksbgVmu50brq1EQ7mDsK0oWCpQnPY87bt%2BRcZIngSY%2FnwycW3WK4c3d%2BUgXwv3TnX7p7kNS5XLS5LESHHCx6PAZPu%2BBtFY7EIWrBdt4JlGRIOFkDiaDEYnJzLVqpaDwGVGhZeWhG7P36U8LfAEkEviuOlcHLF2hbM%2BGtp7Ae90%2BJR%2F5tS5hPoxn6Woa%2F0d3E6LjaSwW40ILZv5w1oD1eQd1YfAM4NXewUx7PYgHU1Th3Gl7LHGSSQJrHF7mWcXaxkvFoAFnM02SwGujhaKiSD86Pzc%2FptzMr3wE%3D&SigAlg=http%3A%2F%2Fwww.w3.org%2F2000%2F09%2Fxmldsig%23rsa-sha1&Signature=Q%2FCdj0Z2L3F3igammLugVElp%2B5A1KiHZH%2BhoVCmb%2BSjtfi9GWJgH12ldrn7OYl8gD2VIs2350o5xu4dLZUzqnClNIrKB9BUmNWlUMycDSt%2BDBzMn%2FaDWQ13HmpwU%2F3xWqJHDjid7nDH%2FSz1szBnzclmv3jgBHD7ve7BDS9ZEfSE%3D
El XML incluido en la SAMLRequest es:
<?xml version="1.0" encoding="UTF-8"?>
<saml2p:LogoutRequest Destination="https://localhost:9443/samlsso"
ID="nebdfcjiecnbgmhlmcidnildnjfaiiojddahddfo"
IssueInstant="2018-11-11T11:40:10.187Z"
NotOnOrAfter="2018-11-11T11:45:10.187Z"
Reason="Single Logout"
Version="2.0"
xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol">
<saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">travelocity.com</saml2:Issuer>
<saml2:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity"
xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">pedro@employee.com</saml2:NameID>
<saml2p:SessionIndex>8ea00e28-68da-46ba-93e4-1203b3d797c0</saml2p:SessionIndex>
</saml2p:LogoutRequest>
Finalmente se obtiene la siguiente respuesta SAML desde el IdP, enviada al SP a http://wso2is.local:9080/travelocity.com/index.jsp:
<?xml version="1.0" encoding="UTF-8"?>
<saml2p:LogoutResponse Destination="http://wso2is.local:9080/travelocity.com/home.jsp"
ID="_a471bcbd7e14ac48e40c9ee3ddaa496c"
InResponseTo="nebdfcjiecnbgmhlmcidnildnjfaiiojddahddfo"
IssueInstant="2018-11-11T11:42:20.772Z"
Version="2.0"
xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol">
<saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity"
xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">localhost</saml2:Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<ds:Reference URI="#_a471bcbd7e14ac48e40c9ee3ddaa496c">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<ds:DigestValue>GoQVy2Ql+vS5XEX/g4QvmHa1k10=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
hjnNU6y7o/8LiUs/I2bNZc3UYoPx9XtrdB8ZOA11szDo1g/I/xdRwq1u9YYRyfjBVU1yeO3adM1l 1FElHkICpx1R41DlmB8G74VF/oYTg3NmVAPoN2t5BXIR7QcZyhxjKXJ9IArUaA8H2/EhWMchZKA1 e48t1uIrKsnjTo6W60g=
</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>
MIICNTCCAZ6gAwIBAgIES343gjANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJVUzELMAkGA1UE CAwCQ0ExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxDTALBgNVBAoMBFdTTzIxEjAQBgNVBAMMCWxv Y2FsaG9zdDAeFw0xMDAyMTkwNzAyMjZaFw0zNTAyMTMwNzAyMjZaMFUxCzAJBgNVBAYTAlVTMQsw CQYDVQQIDAJDQTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzENMAsGA1UECgwEV1NPMjESMBAGA1UE
AwwJbG9jYWxob3N0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCUp/oV1vWc8/TkQSiAvTou sMzOM4asB2iltr2QKozni5aVFu818MpOLZIr8LMnTzWllJvvaA5RAAdpbECb+48FjbBe0hseUdN5 HpwvnH/DW8ZccGvk53I6Orq7hLCv1ZHtuOCokghz/ATrhyPq+QktMfXnRS4HrKGJTzxaCcU7OQID AQABoxIwEDAOBgNVHQ8BAf8EBAMCBPAwDQYJKoZIhvcNAQEFBQADgYEAW5wPR7cr1LAdq+IrR44i
QlRG5ITCZXY9hI0PygLP2rHANh+PYfTmxbuOnykNGyhM6FjFLbW2uZHQTY1jMrPprjOrmyK5sjJR O4d1DeGHT/YnIjs9JogRKv4XHECwLtIVdAbIdWHEtVZJyMSktcyysFcvuhPQK8Qc/E/Wq8uHSCo=
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
<saml2p:Status>
<saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" /></saml2p:Status>
</saml2p:LogoutResponse>
SP initiated SSO (POST Binding)
Si queremos comprobar como sería como sería la petición SAML de tipo POST tendríamos que utilizar el enlace Click here to login with SAML (Post Binding) from Identity Server en la página inicial de Travelocity:
Esta acción desencadena una petición POST a la URL https://localhost:9443/samlsso con el contenido siguiente de la petición SAML como Form Data:
<?xml version="1.0" encoding="UTF-8"?>
<samlp:AuthnRequest AssertionConsumerServiceURL="http://wso2is.local:9080/travelocity.com/home.jsp"
Destination="https://localhost:9443/samlsso"
ForceAuthn="false"
ID="anjclobddcfhlpobilnpknolmgmjdgfohimgebof"
IsPassive="false"
IssueInstant="2018-11-11T12:08:42.030Z"
ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
Version="2.0"
xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
<samlp:Issuer xmlns:samlp="urn:oasis:names:tc:SAML:2.0:assertion">travelocity.com</samlp:Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<ds:Reference URI="#anjclobddcfhlpobilnpknolmgmjdgfohimgebof">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /></ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<ds:DigestValue>gJln4unqGuOcDI84qC/vAsE0kpE=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>PPY3XrRZUQiHzyA/Y0DoFC7g3v44dMuW5NpndeEXGUrMh1o0Hpyx66tcslTRoTIjRxsAk+ACB8jK54sp5v+YTIvaqK2VT9n4kZ4KLHZCL0JAfmu60FIRWjglKbjV0DCnyMAz9ixR9z4K3r7c/ti2Mv/jGvMdrrat1Nxcbt7P8jI=</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>
MIICNTCCAZ6gAwIBAgIES343gjANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJVUzELMAkGA1UECAwCQ0ExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxDTALBgNVBAoMBFdTTzIxEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0xMDAyMTkwNzAyMjZaFw0zNTAyMTMwNzAyMjZaMFUxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzENMAsGA1UECgwEV1NPMjESMBAGA1UEAwwJbG9jYWxob3N0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCUp/oV1vWc8/TkQSiAvTousMzOM4asB2iltr2QKozni5aVFu818MpOLZIr8LMnTzWllJvvaA5RAAdpbECb+48FjbBe0hseUdN5HpwvnH/DW8ZccGvk53I6Orq7hLCv1ZHtuOCokghz/ATrhyPq+QktMfXnRS4HrKGJTzxaCcU7OQIDAQABoxIwEDAOBgNVHQ8BAf8EBAMCBPAwDQYJKoZIhvcNAQEFBQADgYEAW5wPR7cr1LAdq+IrR44iQlRG5ITCZXY9hI0PygLP2rHANh+PYfTmxbuOnykNGyhM6FjFLbW2uZHQTY1jMrPprjOrmyK5sjJRO4d1DeGHT/YnIjs9JogRKv4XHECwLtIVdAbIdWHEtVZJyMSktcyysFcvuhPQK8Qc/E/Wq8uHSCo=
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
<saml2p:NameIDPolicy AllowCreate="true"
Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
SPNameQualifier="Issuer"
xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" />
<saml2p:RequestedAuthnContext Comparison="exact"
xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol">
<saml:AuthnContextClassRef xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef>
</saml2p:RequestedAuthnContext>
</samlp:AuthnRequest>
En este caso nos logamos como Miguel, que tiene el rol cliente, y se genera la respuesta SAML en el IdP que es enviada a la ACS URL del SP en http://wso2is.local:9080/travelocity.com/home.jsp:
<?xml version="1.0" encoding="UTF-8"?>
<saml2p:Response Destination="http://wso2is.local:9080/travelocity.com/home.jsp"
ID="_36c151939e9e409d195f3bdc2bdd8520"
InResponseTo="anjclobddcfhlpobilnpknolmgmjdgfohimgebof"
IssueInstant="2018-11-11T12:09:09.217Z"
Version="2.0"
xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity"
xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">localhost</saml2:Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<ds:Reference URI="#_36c151939e9e409d195f3bdc2bdd8520">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces PrefixList="xs"
xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" />
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<ds:DigestValue>bWGj78u4Mi8eDtiEL9IJhbY7Sa8=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
WNcdyJVHU7Hecdh79edCJTUMHlU65HQ1/I6f7JD7SS6EICtqQKhwGChXOQpnIhqH3dzaU/AlLI/I xnxLpj8rFrQ37rkpDYSTL8Z9orZ+oX90HaXZqzqnL2YsijtPp32ffSDlDAD4rdypiPGqieKPUa5A LlAjCaZQ9gxD0WN+ri8=
</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>
MIICNTCCAZ6gAwIBAgIES343gjANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJVUzELMAkGA1UE CAwCQ0ExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxDTALBgNVBAoMBFdTTzIxEjAQBgNVBAMMCWxv Y2FsaG9zdDAeFw0xMDAyMTkwNzAyMjZaFw0zNTAyMTMwNzAyMjZaMFUxCzAJBgNVBAYTAlVTMQsw CQYDVQQIDAJDQTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzENMAsGA1UECgwEV1NPMjESMBAGA1UE
AwwJbG9jYWxob3N0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCUp/oV1vWc8/TkQSiAvTou sMzOM4asB2iltr2QKozni5aVFu818MpOLZIr8LMnTzWllJvvaA5RAAdpbECb+48FjbBe0hseUdN5 HpwvnH/DW8ZccGvk53I6Orq7hLCv1ZHtuOCokghz/ATrhyPq+QktMfXnRS4HrKGJTzxaCcU7OQID AQABoxIwEDAOBgNVHQ8BAf8EBAMCBPAwDQYJKoZIhvcNAQEFBQADgYEAW5wPR7cr1LAdq+IrR44i
QlRG5ITCZXY9hI0PygLP2rHANh+PYfTmxbuOnykNGyhM6FjFLbW2uZHQTY1jMrPprjOrmyK5sjJR O4d1DeGHT/YnIjs9JogRKv4XHECwLtIVdAbIdWHEtVZJyMSktcyysFcvuhPQK8Qc/E/Wq8uHSCo=
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
<saml2p:Status>
<saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" /></saml2p:Status>
<saml2:Assertion ID="_d1dbfd1fb8dae044c0bdf059c50ffb9b"
IssueInstant="2018-11-11T12:09:09.219Z"
Version="2.0"
xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">localhost</saml2:Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<ds:Reference URI="#_d1dbfd1fb8dae044c0bdf059c50ffb9b">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces PrefixList="xs"
xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" />
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<ds:DigestValue>1tVkETA47vSBM6dy3nlZyMD+430=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
fErqPaX8kUEF5SBBY7kIBpGsa+ntovn5LWhQGKL+LFc/tLSFq6nkCtpyBemZTPZ1GCK6+qH26P0L DwTLrwMOjMw4nNbwAtBIMLos04zYX0il66e2n1bG8fDDIpT0nF0l+LI/g8gZykIsQ4PfwO54MfLT 2jS/AHgD6g+0Sp1KAqY=
</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>
MIICNTCCAZ6gAwIBAgIES343gjANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJVUzELMAkGA1UE CAwCQ0ExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxDTALBgNVBAoMBFdTTzIxEjAQBgNVBAMMCWxv Y2FsaG9zdDAeFw0xMDAyMTkwNzAyMjZaFw0zNTAyMTMwNzAyMjZaMFUxCzAJBgNVBAYTAlVTMQsw CQYDVQQIDAJDQTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzENMAsGA1UECgwEV1NPMjESMBAGA1UE
AwwJbG9jYWxob3N0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCUp/oV1vWc8/TkQSiAvTou sMzOM4asB2iltr2QKozni5aVFu818MpOLZIr8LMnTzWllJvvaA5RAAdpbECb+48FjbBe0hseUdN5 HpwvnH/DW8ZccGvk53I6Orq7hLCv1ZHtuOCokghz/ATrhyPq+QktMfXnRS4HrKGJTzxaCcU7OQID AQABoxIwEDAOBgNVHQ8BAf8EBAMCBPAwDQYJKoZIhvcNAQEFBQADgYEAW5wPR7cr1LAdq+IrR44i
QlRG5ITCZXY9hI0PygLP2rHANh+PYfTmxbuOnykNGyhM6FjFLbW2uZHQTY1jMrPprjOrmyK5sjJR O4d1DeGHT/YnIjs9JogRKv4XHECwLtIVdAbIdWHEtVZJyMSktcyysFcvuhPQK8Qc/E/Wq8uHSCo=
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
<saml2:Subject>
<saml2:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">miguel</saml2:NameID>
<saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
<saml2:SubjectConfirmationData InResponseTo="anjclobddcfhlpobilnpknolmgmjdgfohimgebof"
NotOnOrAfter="2018-11-11T12:14:09.217Z"
Recipient="http://wso2is.local:9080/travelocity.com/home.jsp" /></saml2:SubjectConfirmation>
</saml2:Subject>
<saml2:Conditions NotBefore="2018-11-11T12:09:09.219Z"
NotOnOrAfter="2018-11-11T12:14:09.217Z">
<saml2:AudienceRestriction>
<saml2:Audience>travelocity.com</saml2:Audience>
</saml2:AudienceRestriction>
</saml2:Conditions>
<saml2:AuthnStatement AuthnInstant="2018-11-11T12:09:09.229Z"
SessionIndex="f41d74e5-4668-4be5-aea3-a416a8b96d34">
<saml2:AuthnContext>
<saml2:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</saml2:AuthnContextClassRef>
</saml2:AuthnContext>
</saml2:AuthnStatement>
<saml2:AttributeStatement>
<saml2:Attribute Name="http://wso2.org/claims/role"
NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
<saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="xs:string">CUSTOMERS/customer</saml2:AttributeValue>
<saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="xs:string">Internal/everyone</saml2:AttributeValue>
</saml2:Attribute>
<saml2:Attribute Name="http://wso2.org/claims/displayName"
NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
<saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="xs:string">Miguel Martinez</saml2:AttributeValue>
</saml2:Attribute>
<saml2:Attribute Name="http://wso2.org/claims/mobile"
NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
<saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="xs:string">666666666</saml2:AttributeValue>
</saml2:Attribute>
</saml2:AttributeStatement>
</saml2:Assertion>
</saml2p:Response>
La respuesta SAML obtenida por parte del IdP no difiere en formato de la obtenida cuando iniciamos el flujo en el SP con Redirect Binding.
En este momento obtenemos acceso al recurso protegido con el usuario Miguel.
Para realizar el logout hay que clickear en el enlace Logout (HTTP Post) lo que conlleva la realización de un POST al IdP https://localhost:9443/samlsso con la solicitud de logout:
<?xml version="1.0" encoding="UTF-8"?>
<saml2p:LogoutRequest Destination="https://localhost:9443/samlsso"
ID="pedbhicdbgdfieljkdniengdngpjdfombgkgomak"
IssueInstant="2018-11-11T12:13:30.948Z"
NotOnOrAfter="2018-11-11T12:18:30.948Z"
Reason="Single Logout"
Version="2.0"
xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol">
<saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">travelocity.com</saml2:Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<ds:Reference URI="#pedbhicdbgdfieljkdniengdngpjdfombgkgomak">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /></ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<ds:DigestValue>FA7Zp2fAaLjQnJR4SAIE/BjTpOk=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>AlcgvviZ3ErNy1DgsQX347xB4p+RvGBpn1ArCfzxdZXCuXa/nS6Gfuea8ZztB6v+dwFT1/wvPNkXd04jMDDGlpMaBuKq0Ny5Ct4qqRaIym24aX4I+iAUQju3yyTD9eXneTMGarzovPD3MXkSzGup5RbyB4j1wNdxVPxOfU0WTeM=</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>
MIICNTCCAZ6gAwIBAgIES343gjANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJVUzELMAkGA1UECAwCQ0ExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxDTALBgNVBAoMBFdTTzIxEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0xMDAyMTkwNzAyMjZaFw0zNTAyMTMwNzAyMjZaMFUxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzENMAsGA1UECgwEV1NPMjESMBAGA1UEAwwJbG9jYWxob3N0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCUp/oV1vWc8/TkQSiAvTousMzOM4asB2iltr2QKozni5aVFu818MpOLZIr8LMnTzWllJvvaA5RAAdpbECb+48FjbBe0hseUdN5HpwvnH/DW8ZccGvk53I6Orq7hLCv1ZHtuOCokghz/ATrhyPq+QktMfXnRS4HrKGJTzxaCcU7OQIDAQABoxIwEDAOBgNVHQ8BAf8EBAMCBPAwDQYJKoZIhvcNAQEFBQADgYEAW5wPR7cr1LAdq+IrR44iQlRG5ITCZXY9hI0PygLP2rHANh+PYfTmxbuOnykNGyhM6FjFLbW2uZHQTY1jMrPprjOrmyK5sjJRO4d1DeGHT/YnIjs9JogRKv4XHECwLtIVdAbIdWHEtVZJyMSktcyysFcvuhPQK8Qc/E/Wq8uHSCo=
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
<saml2:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity"
xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">miguel</saml2:NameID>
<saml2p:SessionIndex>f41d74e5-4668-4be5-aea3-a416a8b96d34</saml2p:SessionIndex>
A lo que el IdP contesta con la siguiente respuesta SAML de logout:
?xml version="1.0" encoding="UTF-8"?>
<saml2p:LogoutResponse Destination="http://wso2is.local:9080/travelocity.com/home.jsp"
ID="_94b6457724c0d11ae6c3f32a928d2794"
InResponseTo="pedbhicdbgdfieljkdniengdngpjdfombgkgomak"
IssueInstant="2018-11-11T12:15:14.448Z"
Version="2.0"
xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol">
<saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity"
xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">localhost</saml2:Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<ds:Reference URI="#_94b6457724c0d11ae6c3f32a928d2794">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<ds:DigestValue>XsGG9M6Hk26lcbjXixcxDTc+Cis=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
FBdMC41gJZjZsL9JbkoWh5fTfo2vyLlP9CX5Ml4AG3HWPagIpHgv+1zt8dwvYxUpuVDX0/WEi6rW MNvvMLOUg1pDXIokpR6KW25bG6py18AC6dudTHykgIwJSmg42qjgnZQhwiDRLphFAd1XQHJyMDqK SE2UvBEkjVS5d9xsVeY=
</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>
MIICNTCCAZ6gAwIBAgIES343gjANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJVUzELMAkGA1UE CAwCQ0ExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxDTALBgNVBAoMBFdTTzIxEjAQBgNVBAMMCWxv Y2FsaG9zdDAeFw0xMDAyMTkwNzAyMjZaFw0zNTAyMTMwNzAyMjZaMFUxCzAJBgNVBAYTAlVTMQsw CQYDVQQIDAJDQTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzENMAsGA1UECgwEV1NPMjESMBAGA1UE
AwwJbG9jYWxob3N0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCUp/oV1vWc8/TkQSiAvTou sMzOM4asB2iltr2QKozni5aVFu818MpOLZIr8LMnTzWllJvvaA5RAAdpbECb+48FjbBe0hseUdN5 HpwvnH/DW8ZccGvk53I6Orq7hLCv1ZHtuOCokghz/ATrhyPq+QktMfXnRS4HrKGJTzxaCcU7OQID AQABoxIwEDAOBgNVHQ8BAf8EBAMCBPAwDQYJKoZIhvcNAQEFBQADgYEAW5wPR7cr1LAdq+IrR44i
QlRG5ITCZXY9hI0PygLP2rHANh+PYfTmxbuOnykNGyhM6FjFLbW2uZHQTY1jMrPprjOrmyK5sjJR O4d1DeGHT/YnIjs9JogRKv4XHECwLtIVdAbIdWHEtVZJyMSktcyysFcvuhPQK8Qc/E/Wq8uHSCo=
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
<saml2p:Status>
<saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" /></saml2p:Status>
</saml2p:LogoutResponse>
Como se puede observar en los diferentes mensajes SAML hay un pequeño desfase debido a que se han ido recopilando paso a paso para la elaboración de este artículo.
IdP initiated SSO
Hasta ahora hemos visto como el procedimiento de autenticación basado en SSO era iniciado por una petición de tipo SAMLRequest en el Service Provider. En este apartado vamos a ver como se puede iniciar este proceso en el Idp sin necesidad de que el usuario acceda primero a la aplicación Service Provider y genere una SAMLRequest.
La forma en la que se inicia el proceso es con una petición GET al Identity Server indicándole el Service Provider sobre el que se solicita la autenticación. El contexto y el formato de la petición son los siguientes:
https://localhost:9443/samlsso?spEntityID=sp-issuer
En nuestro caso el parámetro spEntityId tendría el valor travelocity.com que es el issuer que se indicó en la configuración del Service Provider:
https://localhost:9443/samlsso?spEntityID=travelocity.com
Una vez enviada la petición al IdP al usuario se le solicitan las credenciales, introducimos la de Pablo:
Y al introducirlas se accede al recurso protegido:
La respuesta emitida por el Identity Provider es enviada a la Assertion Consumer Service URL del Service Provider
http://wso2is.local:9080/travelocity.com/home.js y es la siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<saml2p:Response Destination="http://wso2is.local:9080/travelocity.com/home.jsp"
ID="_d7e4ed50b8221388d3b7d5d92ced16bb"
IssueInstant="2018-11-15T20:35:04.257Z"
Version="2.0"
xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity"
xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">localhost</saml2:Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<ds:Reference URI="#_d7e4ed50b8221388d3b7d5d92ced16bb">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces PrefixList="xs"
xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" />
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<ds:DigestValue>LmZFqsFJZcRL5fMhET9dCeeDYfo=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
gx52vvH61pq9yJAZpjMWWtuZyQdgMfdb1wSHy3BBKVrmTdPKn18CYevmxBbXVp3QwkRE8HYMmyJl GcKrEElZyTfJiwtceqoSIA76FfE2TBrcrnCsIQtmX0CeEMUkbH1b2+QWBpviW9PkZ4kl0zWWKnOL Y7rNrbFPN92FggOp0gg=
</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>
MIICNTCCAZ6gAwIBAgIES343gjANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJVUzELMAkGA1UE CAwCQ0ExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxDTALBgNVBAoMBFdTTzIxEjAQBgNVBAMMCWxv Y2FsaG9zdDAeFw0xMDAyMTkwNzAyMjZaFw0zNTAyMTMwNzAyMjZaMFUxCzAJBgNVBAYTAlVTMQsw CQYDVQQIDAJDQTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzENMAsGA1UECgwEV1NPMjESMBAGA1UE
AwwJbG9jYWxob3N0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCUp/oV1vWc8/TkQSiAvTou sMzOM4asB2iltr2QKozni5aVFu818MpOLZIr8LMnTzWllJvvaA5RAAdpbECb+48FjbBe0hseUdN5 HpwvnH/DW8ZccGvk53I6Orq7hLCv1ZHtuOCokghz/ATrhyPq+QktMfXnRS4HrKGJTzxaCcU7OQID AQABoxIwEDAOBgNVHQ8BAf8EBAMCBPAwDQYJKoZIhvcNAQEFBQADgYEAW5wPR7cr1LAdq+IrR44i
QlRG5ITCZXY9hI0PygLP2rHANh+PYfTmxbuOnykNGyhM6FjFLbW2uZHQTY1jMrPprjOrmyK5sjJR O4d1DeGHT/YnIjs9JogRKv4XHECwLtIVdAbIdWHEtVZJyMSktcyysFcvuhPQK8Qc/E/Wq8uHSCo=
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
<saml2p:Status>
<saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" /></saml2p:Status>
<saml2:Assertion ID="_2fd154db85f636645f8790978e30b264"
IssueInstant="2018-11-15T20:35:04.350Z"
Version="2.0"
xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">localhost</saml2:Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<ds:Reference URI="#_2fd154db85f636645f8790978e30b264">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces PrefixList="xs"
xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" />
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<ds:DigestValue>qazMFH7S0TjoKiGgg59xMTE1HwU=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
azm/JfN11FrPnD3bepmgpPJyL9+U1WSrt9bxILzmWA1hFGX0rt7ULGb+/koGXhnAIhTT4cHL1QEK T0bzjupgdYrVr+vMh2WC+RIgejwUIk1r6iOh9NsaC80c/qnPreOcW3loCBA9cNJTV98uj0VweBPG eU4QC9uuCRkOaDo+wyM=
</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>
MIICNTCCAZ6gAwIBAgIES343gjANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJVUzELMAkGA1UE CAwCQ0ExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxDTALBgNVBAoMBFdTTzIxEjAQBgNVBAMMCWxv Y2FsaG9zdDAeFw0xMDAyMTkwNzAyMjZaFw0zNTAyMTMwNzAyMjZaMFUxCzAJBgNVBAYTAlVTMQsw CQYDVQQIDAJDQTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzENMAsGA1UECgwEV1NPMjESMBAGA1UE
AwwJbG9jYWxob3N0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCUp/oV1vWc8/TkQSiAvTou sMzOM4asB2iltr2QKozni5aVFu818MpOLZIr8LMnTzWllJvvaA5RAAdpbECb+48FjbBe0hseUdN5 HpwvnH/DW8ZccGvk53I6Orq7hLCv1ZHtuOCokghz/ATrhyPq+QktMfXnRS4HrKGJTzxaCcU7OQID AQABoxIwEDAOBgNVHQ8BAf8EBAMCBPAwDQYJKoZIhvcNAQEFBQADgYEAW5wPR7cr1LAdq+IrR44i
QlRG5ITCZXY9hI0PygLP2rHANh+PYfTmxbuOnykNGyhM6FjFLbW2uZHQTY1jMrPprjOrmyK5sjJR O4d1DeGHT/YnIjs9JogRKv4XHECwLtIVdAbIdWHEtVZJyMSktcyysFcvuhPQK8Qc/E/Wq8uHSCo=
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
<saml2:Subject>
<saml2:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">pablo@employee.com</saml2:NameID>
<saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
<saml2:SubjectConfirmationData NotOnOrAfter="2018-11-15T20:40:04.257Z"
Recipient="http://wso2is.local:9080/travelocity.com/home.jsp" /></saml2:SubjectConfirmation>
</saml2:Subject>
<saml2:Conditions NotBefore="2018-11-15T20:35:04.350Z"
NotOnOrAfter="2018-11-15T20:40:04.257Z">
<saml2:AudienceRestriction>
<saml2:Audience>travelocity.com</saml2:Audience>
</saml2:AudienceRestriction>
</saml2:Conditions>
<saml2:AuthnStatement AuthnInstant="2018-11-15T20:35:04.361Z"
SessionIndex="fb46cbc4-2d85-46ff-b53f-be9e150a1ab9">
<saml2:AuthnContext>
<saml2:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</saml2:AuthnContextClassRef>
</saml2:AuthnContext>
</saml2:AuthnStatement>
<saml2:AttributeStatement>
<saml2:Attribute Name="http://wso2.org/claims/role"
NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
<saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="xs:string">EMPLOYEES/employee</saml2:AttributeValue>
<saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="xs:string">Internal/everyone</saml2:AttributeValue>
</saml2:Attribute>
<saml2:Attribute Name="http://wso2.org/claims/displayName"
NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
<saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="xs:string">Pablo Perez</saml2:AttributeValue>
</saml2:Attribute>
<saml2:Attribute Name="http://wso2.org/claims/mobile"
NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
<saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="xs:string">888888888</saml2:AttributeValue>
</saml2:Attribute>
</saml2:AttributeStatement>
</saml2:Assertion>
</saml2p:Response>
Si ahora intentamos acceder a Avis veríamos como ya estamos autenticados en esta aplicación sin necesidad de volver a facilitar las credenciales:
IdP initiated Single Logout
Para poder utilizar esta funcionalidad de Identity Server debe haber habilitado la opción Enable IdP Initiated SLO en la configuración del SP en IS.
El formato de la petición de single logout es el siguiente:
https://localhost:9443/samlsso?slo=true&spEntityID=sp-issuer&returnTo=url-redirection
- El parámetro slo es obligatorio y debe tener valor true para realizar este tipo de petición.
- El parámetro spEntityID es opcional e indica el valor del campo issuer configurado para el SP.
- El parámetro returnTo es opcional e indica la URL donde se redireccionará al usuario después de hacer el logout, esta URL debe estar configurada también en el SP para que sea confiable y se pueda utilizar.
En nuestro caso lanzamos la petición:
https://localhost:9443/samlsso?slo=true&spEntityID=travelocity.com
Ante esta petición IS responde enviando peticiones de logout a todos los Service Providers que participan en la sesión y haciendo una redirección a la página de logout por defecto:
Conclusión
En este artículo hemos visto en detalle cómo funciona el flujo de mensajes para establecer una sesión basada en Web SSO viendo diferentes opciones de cómo iniciar este proceso. En algunos casos aplicará más una estrategia en la que el Service Provider inicie el procedimiento con una SAML Request y en otros casos será mas interesante iniciar el procedimiento desde el IdP sin tener que pasar primero por el Service Provider.
¡Síguenos en Twitter para estar al día de próximas entregas de esta serie!