2008-09-04 673 views
95

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 a través de cookies.Inicio de sesión único en varios dominios

Cuando alguien que inició sesión en un dominio necesita acceder a algo desde el otro, el usuario debe iniciar sesión de nuevo con credenciales diferentes en el otro sitio web, ubicado en el otro dominio.

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

Gracias.

Editar: Los sitios web son una mezcla de sitios de Internet (externo) e intranet (interno-utilizado dentro de la empresa).

+0

Esto suena como un trabajo para [OpenID] (http://openid.net/) - pero solo permite ID de su dominio de inicio de sesión. – Neall

Respuesta

2

Si usa Active Directory puede 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 hablar entre sí detrás de las escenas, podría utilizar sessionids y tener una aplicación que maneje generación de id que sirva a todas sus otras aplicaciones.

+0

¿No es el usuario todavía tiene que ingresar el nombre de usuario y la contraseña en domain1.com y domain2.com y domain3.com cuando aterriza en esos sitios la primera vez para esta sesión? – HaBo

14

¿Cuán diferentes son los nombres de host?

Estos huéspedes pueden compartir las 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 se puede golpear a una solución basada en cookies. Think GUID y una tabla de sesión de base de datos.

76

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

  1. Hay un dominio maestro, login.mydomain.com con el master_login.php script que gestiona los inicios de sesión.
  2. Cada dominio de cliente tiene la secuencia de comandos 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, lo redirige al dominio maestro (login.mydomain.com/master_login.php). Si el usuario no ha iniciado sesión en el maestro, solicita la autenticación del usuario (es decir, muestra la página de inicio de sesión). Después de que el usuario se autentica, crea una sesión en una base de datos. Si el usuario ya está autenticado, busca su ID de sesión en la base de datos.
  5. El dominio maestro regresa al dominio del cliente (client.mydomain.com/client_login.php) pasando el ID de la sesión.
  6. El dominio del cliente crea una cookie que almacena la identificación de la sesión del maestro. El cliente puede averiguar el usuario conectado al consultar la base de datos compartida usando la identificación de la sesión.

Notas:

  • El identificador de sesión es un identificador global único generado con el algoritmo de RFC 4122
  • El master_login.php sólo se redirigirá a los dominios en su lista blanca
  • El maestro y los clientes puede estar en diferentes dominios de nivel superior. P.ej. client1.abc.com, client2.xyz.com, login.midominio.com
+0

Esto parece una buena solución grom. ¿Qué almacena en la base de datos? ¿Es (session_id, username, hashed_password)? –

+1

¿Cómo se maneja el caso en el dominio maestro login.mydomain.com se cae? ¿Es imposible iniciar sesión en ese punto? – jjxtra

+3

¿Alguno de los cuerpos ha producido algún ejemplo de código o un repositorio github? –

30

No reinventar la rueda. Hay una serie de paquetes SSO entre dominios de código abierto 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.

+2

Absolutamente: he visto demasiadas personas rodar sus propias soluciones de seguridad solo para descubrir que son vulnerables a la repetición, XSRF u otros ataques –

+3

+1 Debería [casi] nunca reinventar la rueda de seguridad. –

+6

OpenSSO está muerto y JOSSO y CAS son soluciones de JAVA. Solo un FYI – OneHoopyFrood

Cuestiones relacionadas