Inicio de sesión único en varios dominios [cerrado]

110

Nuestra empresa tiene varios dominios configurados con un sitio web alojado en cada uno de los dominios. En este momento, cada dominio tiene su propia autenticación que se realiza mediante cookies.

Cuando alguien que inicia sesión en un dominio necesita acceder a cualquier cosa del otro, el usuario debe iniciar sesión nuevamente con diferentes credenciales en el otro sitio web, ubicado en el otro dominio.

Estaba pensando en avanzar hacia el inicio de sesión único (SSO), para que se pueda eliminar esta molestia. Agradecería cualquier idea sobre cómo se podría lograr esto, ya que no tengo ninguna experiencia al respecto.

Gracias.

Editar: Los sitios web son una combinación de sitios de Internet (externos) e intranet (de uso interno dentro de la empresa).

Pascal
fuente
Esto parece un trabajo para OpenID , pero solo permite ID de su dominio de inicio de sesión.
Neall
2
@Will Es posible que esta pregunta no sea para este sitio web de la red SE, pero definitivamente es constructiva .
Binar Web
@BinarWeb Las razones cercanas han evolucionado desde 2008. En ese entonces, esta era la opción más aplicable.

Respuestas:

91

La solución SSO que he implementado aquí funciona de la siguiente manera:

  1. Hay un dominio maestro, login.mydomain.com con el script master_login.php que administra los inicios de sesión.
  2. Cada dominio de cliente tiene el script client_login.php
  3. Todos los dominios tienen una base de datos de sesión de usuario compartida.
  4. Cuando el dominio del cliente requiere que el usuario inicie sesión, se redirige al dominio maestro (login.mydomain.com/master_login.php). Si el usuario no ha iniciado sesión en el maestro, solicita autenticación del usuario (es decir, mostrar la página de inicio de sesión). Una vez que el usuario está autenticado, crea una sesión en una base de datos. Si el usuario ya está autenticado, busca su identificación de sesión en la base de datos.
  5. El dominio maestro vuelve al dominio del cliente (client.mydomain.com/client_login.php) pasando la identificación de la sesión.
  6. El dominio del cliente crea una cookie que almacena la identificación de sesión del maestro. El cliente puede encontrar al usuario que ha iniciado sesión consultando la base de datos compartida utilizando el ID de sesión.

Notas:

  • El ID de sesión es un identificador global único generado con el algoritmo de RFC 4122
  • El master_login.php solo redirigirá a los dominios en su lista blanca
  • El maestro y los clientes pueden estar en diferentes dominios de nivel superior. P.ej. client1.abc.com, client2.xyz.com, login.mydomain.com
grom
fuente
Esto parece una buena solución grom. ¿Qué almacena en la base de datos? ¿Es (session_id, username, hashed_password)?
Jon M
3
¿Cómo maneja el caso en el que el dominio maestro login.mydomain.com falla? ¿Es imposible iniciar sesión en ese momento?
jjxtra
3
¿Algún organismo produjo ejemplos de código o un repositorio de github?
Joshua F. Rountree
Esto es lo que especifican casi todos los protocolos SSO (por ejemplo, SAML), pero con más seguridad contra ataques de repetición y demás.
cweiske
2
¿Qué pasa si no comparten la base de datos de usuarios? Cada aplicación web asociada tiene su propia base de usuarios. ¿Cómo nos encontramos con esto?
stuckedoverflow
33

No reinventes la rueda. Hay una serie de paquetes SSO de código abierto entre dominios, como JOSSO, OpenSSO, CAS, Shibboleth y otros. Si está utilizando la tecnología de Microsoft en todo (IIS, AD), puede usar Microsoft federation (ADFS) en su lugar.

Markc
fuente
4
Absolutamente: he visto a demasiadas personas lanzar sus propias soluciones de seguridad solo para descubrir que son vulnerables a la reproducción, XSRF u otros ataques
5
+1 [casi] nunca debería reinventar la rueda de la seguridad.
Mark E. Haase
13
OpenSSO está muerto y JOSSO y CAS son soluciones JAVA. Solo un FYI
OneHoopyFrood
15

¿Qué tan diferentes son los nombres de host?

Estos hosts pueden compartir cookies:

  • mail.xyz.com
  • www.xyz.com
  • logon.xyz.com

Pero estos no pueden:

  • abc.com
  • xyz.com
  • www.tre.com

En el primer caso, puede utilizar una solución basada en cookies. Piense en GUID y una tabla de sesión de base de datos.

jason saldo
fuente
2

Si usa Active Directory, podría hacer que cada aplicación use AD para la autenticación, el inicio de sesión podría ser perfecto.

De lo contrario, si las aplicaciones pueden comunicarse entre sí entre bastidores, puede usar los identificadores de sesión y tener una aplicación que maneje la generación de identificadores para todas sus demás aplicaciones.

Miguel
fuente
2
¿No es necesario que el usuario ingrese el nombre de usuario y la contraseña en dominio1.com, dominio2.com y dominio3.com cuando ingresa a esos sitios por primera vez para esta sesión?
HaBo