Actualmente, mi empresa desarrolla una aplicación web Java. Un par de nuestros clientes tienen servidores SAML internos (¿proveedores de identidad?) Y han solicitado que nos integremos con ellos. Recientemente he estado leyendo y jugando con OpenAM. Después de unos 3 días de esto, tengo una comprensión general del mismo, pero todavía hay algunas lagunas en mi conocimiento. Mi esperanza es que alguien pueda aclararme esto.
Así que así es como imagino el flujo de trabajo de un usuario que inicia sesión.
Definamos el servidor SAML de nuestros clientes como https://their.samlserver.com . Entonces, un usuario acude a nuestra aplicación web en busca de un recurso que está protegido. Digamos que la URL es http://my.app.com/something .
Entonces, si estoy en lo cierto, my.app.com es lo que SAML define como proveedor de servicios . Nuestra aplicación se da cuenta de que este usuario necesita iniciar sesión. A continuación, presentamos una página como esta al usuario ...
<script>JQuery Script to auto submit this form on ready</script>
<form method="post" action="https://their.samlserver.com/Post/Servlet">
<input type="hidden" name="SAMLRequest" value="someBase64Data" />
<input type="submit" value="Submit" />
</form>
Y esa someBase64Data
debería ser base64
una versión codificada de esto ...
<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>http://my.app.com</saml:Issuer>
<samlp:NameIDPolicy
AllowCreate="true"
Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/>
</samlp:AuthnRequest>
Así que mi primer par de preguntas.
¿Cuál se supone que es el valor de ID ?
¿Y por qué puedo declararme Emisor ?
¿El proveedor de identidad me conoce? Tal vez este sea el círculo de confianza que he estado viendo en OpenAM . Y si sabe de mí, ¿cómo sabe de mí y qué necesita saber?
Entonces, una vez que se reenvía al usuario esa página, se lo lleva a una página proporcionada por el IDP https://their.samlserver.com . Se autentican en esa página y el IDP hace su magia para validar la autenticación y buscar al usuario. Una vez que la autenticación es exitosa, el IDP devuelve un <samlp:Response>
definido aquí .
Algunas preguntas más.
Primero, ¿cómo <samlp:Response>
puedo volver a mi aplicación web para poder verificarla?
¿Y qué debería buscar en esa respuesta para validar que fue exitosa? ¿Cómo se ve una falla?
Actualmente usamos la dirección de correo electrónico (LDAP) para identificar a los usuarios, por lo que probablemente lo tomaremos de la respuesta y lo usaremos de la misma manera que lo hacemos ahora. ¿Algo más que deba tener en cuenta en esa respuesta?
Entonces, ahora que hemos verificado la validez de esa respuesta, podemos otorgarle al usuario una sesión como lo hacemos actualmente. Pero cuando quieren cerrar la sesión, ¿existe un flujo de trabajo para eso? ¿Tengo que notificar al IDP que el usuario se ha ido?
Y finalmente, hay un par de temas que se han tratado en mi lectura y no estoy seguro de cómo encajan en este flujo de trabajo. Son Círculo de confianza , Fichas y Artefactos .
Gracias por la ayuda a todos. He encontrado mucha información en los últimos días, y es posible que pueda juntarlos después de jugar un poco más. Pero todavía tengo que encontrar un artículo de flujo de trabajo sencillo "Aquí está la publicación". Tal vez sea porque estoy equivocado sobre cómo funciona esto. Tal vez sea porque esto no es tan popular. Pero realmente quería asegurarme de tener el flujo de trabajo para no perderme un paso crucial en algo tan importante como la autenticación del usuario.
fuente
Respuestas:
En respuesta a sus preguntas específicas:
1.) ¿Cuál se supone que es el valor de "ID"?
2.) ¿Cómo le conoce el IdP?
3.) ¿Dónde está la respuesta y qué verificar?
4.) ¿Qué pasa con Cerrar sesión?
En resumen, esto puede ser bastante complejo de implementar desde cero. Es mejor usar bibliotecas y / o productos probados y verdaderos como sugiere Ian. Empresas como la suya han invertido cientos de horas de tiempo de desarrollo para implementar de acuerdo con las especificaciones y la interoperabilidad de prueba con otros proveedores.
fuente
Si solo está tratando de configurar una sola aplicación Java como proveedor de servicios, debería considerar usar un Fedlet de Oracle (como independiente) o ForgeRock (incluido con OpenAM). ForgeRock Fedlet tiene algunos problemas para interactuar con Shibboleth 2.2.1 como proveedor de identidad, pero me parece algo más sencillo de configurar y más informativo.
Cada uno tiene instrucciones explícitas contenidas en el README para ayudarlo a implementar. Una vez que el Fedlet está configurado y comunicándose con el IDP, la página de éxito le muestra todo el código que necesita para integrar el SSO federado en su aplicación. Hace el trabajo de fondo de enviar y recibir AuthnRequests y Responses.
La respuesta de Scott responde bastante bien a las preguntas que tenías, pero creo que intentar escribir el código por tu cuenta que genere el SAML es reinventar la rueda. El Fedlet fue diseñado precisamente con este caso de uso en mente.
fuente