Estamos trabajando en una implementación de SSO que se usaría en todos los dominios. Me doy cuenta de que hay modelos de trabajo comprobados como CAS para esto, pero estoy jugando con un enfoque diferente y quiero recibir comentarios de todos ustedes para ver si esto es seguro o no. La premisa básica es que no queremos utilizar redireccionamientos si no tenemos que hacerlo y queremos que los sitios de productos puedan diseñar sus propias páginas de inicio de sesión. Esto apunta a IE8 +, FF moderno y webkit solamente. Entonces, sin más dilación la implementación:
- El cliente navega al sitio del producto A.com. No tienen una cookie de sesión para a.com, por lo que el sitio inicia el script de autenticación principal.
- El script principal crea un iframe que carga una página desde el servidor de autenticación en auth.com. Auth.com valida la solicitud basándose en el encabezado del remitente y si el remitente no es de confianza, responde con x-frame-options: DENY y / o una redirección de eliminación de marcos.
- El script en esta página (el script enmarcado) realiza una solicitud ajax al servidor de auth.com solicitando un token de tiempo de SSO 1 (1TT).
- El cliente no tiene una cookie de auth.com, por lo que se rechaza, y el script iframe le dice al script principal que cree un formulario de autenticación usando window.postMessage (y el script principal valida el origen) para comunicarse, ya que es dominio cruzado.
- El usuario ingresa sus credenciales y pulsa enviar.
- Las credenciales se pasan del script principal al script enmarcado a través de postMessage nuevamente, y el script enmarcado los usa para iniciar sesión en auth.com, recibiendo una cookie auth.com y una 1TT.
- El 1TT se devuelve a la secuencia de comandos principal.
- La secuencia de comandos principal pasa el 1TT al servidor de A.com.
- A.com usa 1TT para obtener la información del usuario del servidor de auth.com a través de una API interna privada, y auth.com invalida el 1TT por lo que no se puede usar nuevamente.
-
A.com devuelve una cookie de sesión para A.com para el cliente, y ahora el cliente continúa con su negocio en A.com.
-
Luego, el cliente navega a B.com, pero nuevamente no tiene una cookie de sesión para B.com. La secuencia de comandos principal se ejecuta de nuevo, lo que crea un iframe nuevamente que apunta a auth.com. El script de iframe solicita un 1TT de auth.com, y como tiene una cookie de sesión para auth.com, esta vez obtiene uno.
- El 1TT pasa del script iframe al script principal al servidor de B.com, que lo utiliza para obtener al usuario de auth.com y emitir una cookie de sesión para B.com.
Mi principal preocupación es en el paso 2. ¿Es esta una forma sólida de evitar el encuadre malicioso? ¿A qué otras vulnerabilidades de seguridad es susceptible?
Editar: todos los sitios y scripts se cargarán HTTPS.