tutorial - Buscando comentarios sobre una primera implementación de SAML
inicio de sesión único basado en saml sso (2)
No necesita un sujeto en la solicitud, mirando las especificaciones, creo que puede ser así de simple:
<?xml version="1.0" encoding="UTF-8"?>
<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
ID="abc" Version="2.0" IssueInstant="1970-01-01T00:00:00.000Z"
</samlp:AuthnRequest>
Omitir todos los elementos y atributos opcionales (Issuer, NameIDPolicy, AssertionConsumerServiceURL, etc.) significa que su proveedor de identidad y proveedor de servicios los han aceptado por adelantado, por lo que no es necesario especificarlos en AuthnRequest. Si tiene el control de ambos extremos y sabe que nunca agregará otro proveedor a la mezcla, esta es una solicitud SAML perfectamente legal. Significa "Autenticar al usuario que presenta esto a través del mecanismo que acordamos".
Mirando la respuesta, creo que este es el caso mínimo:
<?xml version="1.0" encoding="UTF-8"?>
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
ID="123" InResponseTo="abc" IssueInstant="2008-11-21T17:13:42.872Z"
Version="2.0">
<samlp:Status>
<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
</samlp:Status>
<saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" Version="2.0">
<saml:Subject>
<saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">
[email protected]
</saml:NameID>
</saml:Subject>
<saml:AuthnStatement AuthnInstant="2008-11-21T17:13:42.899Z">
<saml:AuthnContext>
<saml:AuthnContextClassRef>
urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport
</saml:AuthnContextClassRef>
</saml:AuthnContext>
</saml:AuthnStatement>
</saml:Assertion>
</samlp:Response>
Puede enviar la dirección de correo electrónico del usuario como el NameID, y el AuthnStatement solo conlleva el hecho de que el proveedor de identidad autenticó al usuario en el momento dado mediante el mecanismo dado. De nuevo, esto está desprovisto de todo detalle: omitimos atributos y elementos como Destination y SubjectConfirmationMethod porque son superfluos para el caso de uso.
Por lo tanto, esta respuesta dice "Este es [email protected]; inició sesión con una contraseña a través de un transporte protegido (SSL / TLS) a las 17:13:42 el 21/11/2008".
Debería echarle un vistazo a las especificaciones de los perfiles de SAML 2.0 para conocer el mecanismo exacto para pasarlas de un lado a otro. AuthnRequest generalmente se comprime, codifica y pasa como un parámetro de URL en un GET, mientras que la forma más sencilla de devolver la respuesta es a través del enlace POST: devuelve una página HTML con un formulario cuyo objetivo es el proveedor del servicio, y que se envía a tiempo de carga de página a través de JavaScript.
Me han encomendado el diseño de un proceso SSO (inicio de sesión único) muy simple. Mi empleador ha especificado que debe implementarse en SAML. Me gustaría crear mensajes que sean absolutamente tan simples como sea posible mientras confirmo las especificaciones de SAML.
Estaría muy agradecido si algunos de ustedes miraran mis mensajes de solicitud y respuesta y me dijeran si tienen sentido para mi propósito, si incluyen algo que no necesita estar allí, y si les falta algo que lo haga necesito estar allí.
Además, me gustaría saber en qué parte de la respuesta debería incluir información adicional sobre el tema; en particular, la dirección de correo electrónico del sujeto.
La interacción debe funcionar de la siguiente manera:
- El usuario solicita el servicio del proveedor del servicio en este momento, el proveedor del servicio no sabe nada sobre el usuario.
- El proveedor de servicios solicita autenticación para el usuario del proveedor de identidades
- El usuario es autenticado / registrado por el proveedor de identidad
- El proveedor de identidad responde al proveedor del servicio con un mensaje de autenticación exitosa, ADEMÁS de la dirección de correo electrónico del usuario.
Esto es lo que creo que la solicitud debe ser:
<?xml version="1.0" encoding="UTF-8"?>
<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
ID="abc"
IssueInstant="1970-01-01T00:00:00.000Z"
Version="2.0"
AssertionConsumerServiceURL="http://www.IdentityProvider.com/loginPage">
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
http://www.serviceprovider.com
</saml:Issuer>
<saml:Subject>
<saml:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">3f7b3dcf-1674-4ecd-92c8-1544f346baf8</saml:NameID>
</saml:Subject>
Esto es lo que creo que la respuesta debería ser:
<?xml version="1.0" encoding="UTF-8"?>
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" Destination="http://www.serviceprovider.com/desitnationURL" ID="123" IssueInstant="2008-11-21T17:13:42.872Z" Version="2.0">
<samlp:Status>
<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
</samlp:Status>
<saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" Version="2.0">
<saml:Subject>
<saml:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">3f7b3dcf-1674-4ecd-92c8-1544f346baf8</saml:NameID>
<saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:profiles:SSO:browser">
<saml:SubjectConfirmationData InResponseTo="abc"/>
</saml:SubjectConfirmation>
</saml:Subject>
<saml:AuthnStatement AuthnInstant="2008-11-21T17:13:42.899Z">
<saml:AuthnContext>
<saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef>
</saml:AuthnContext>
</saml:AuthnStatement>
</saml:Assertion>
</samlp:Response>
Entonces, de nuevo, mis preguntas son:
¿Es esta una interacción SAML válida?
¿Se puede simplificar el XML de solicitud o de respuesta?
¿En qué parte de la respuesta debo poner la dirección de correo electrónico del sujeto?
Realmente aprecio tu ayuda. ¡Muchas gracias!
-Morgan
Sí, parece ser una interacción SAML
Su respuesta de autenticación es bastante simple ahora. Por lo general, le gustaría agregar más atributos en sus afirmaciones. Y por el bien de la seguridad, al menos la respuesta debería estar firmada.
Suele establecerse después de .En su caso, no lo tiene, por lo tanto, después de que el estado esté correcto ...
Te recomendaría crear una cuenta en http://www.ssocircle.com , y con un perfil de cabeceras HTTP (es decir, el clásico y excelente LiveHttpHeaders) y un depurador SAML2 (Depurador SAML2 de Feide Rn, ¡ gracias chicos!) Echa un vistazo a el flujo de solicitud / respuesta ...
Espero eso ayude,
Luis
ps: si quieres echar un vistazo a una implementación completa SP / IdP: http://sourceforge.net/projects/spring-saml/files%2F0.1/