2010-01-13 17 views
25

Tengo dos dominios, domain1.com y domain2.com apuntando al mismo sitio web asp.net que usa la compilación asp.net en autenticación de formularios. El problema es que incluso si los dominios apuntan al mismo sitio web, el usuario solo se autentica para un dominio a la vez. Entonces, si usa www.domain1.com primero y luego visita www.domain2.com, es el mismo sitio web en la parte posterior, pero solo está autenticado para www.domain1.com. Lo mismo sucede si usa www y no www cuando visita los sitios.Autenticación de formas Asp.net y dominios múltiples

Esto es lo que uso para iniciar sesión:

FormsAuthentication.RedirectFromLoginPage(username, cookie.Checked); 

Para comprobar entrada:

User.Identity.IsAuthenticated 

¿Cómo puedo hacer que el usuario se autentica para todos los dominios que apunta al mismo sitio web?

+0

La cookie de autenticación, como la mayoría de las galletas, se almacenan por dominio para evitar la polinización entre dominios y la suplantación. Por qué querrías hacer esto? – Lazarus

+3

Porque a veces tiene varios sitios que desea que el usuario pueda usar sin problemas, sin tener que iniciar sesión en cada uno por separado. –

+0

¿Por qué no seguir la metodología StackOverflow y utilizar un proveedor de autenticación externo como OpenID. – Lazarus

Respuesta

44

Lo que está buscando es una solución de inicio de sesión único.

Como autenticación de ASP.NET está en su corazón por lo general Basado en cookies, hay dos cosas que ver:

  1. Establecer las cookies correctamente.
  2. Registre a sus usuarios en el dominio alternativo durante el registro.

En cuanto a ambos con mayor profundidad:

1. galletas correctamente el ajuste

Usted necesita asegurarse de que ASP.NET está escribiendo las galletas vale de autenticación al dominio raíz, en vez que el dominio explícita esto se hace mediante el atributo del elemento domain formas:

<forms 
    name="name" 
    loginUrl="URL" 
    defaultUrl="URL" 
    domain=".example.com"> 
</forms> 

debe establecer su dominio a ".example.com" - tenga en cuenta el período principal - esta es la clave. De esta forma, las solicitudes a example.com y www.example.com leerán la cookie correctamente y autenticarán al usuario.

2. Los usuarios de rebote al dominio alternativo

Lo que hemos implementado en algunos sitios que utilizan un inicio de sesión único es un proceso de inicio de sesión de ida y vuelta. El usuario se autentica en el primer dominio, codificamos los datos de acceso, y redirigirlos a una página conocido en el segundo dominio, registrarlos en allí, y luego volver a redirigir el servidor original.

Esta redirección del lado del cliente es importante - las cookies sólo se dan cuando hay una respuesta de vuelta al cliente, y el navegador tiene que visitar el segundo dominio para ver realmente las galletas.

Otros detalles a tener en cuenta en este tipo de puesta a punto:

  1. Usted probablemente querrá tener un tiempo de espera en el inicio de sesión cifrada detalles - de modo que recordar que el URL del historial del navegador no lo hace de forma automática inicie sesión con el usuario.
  2. Si los dominios están en servidores diferentes, deberá asegurarse de que las claves de la máquina estén configuradas de la misma manera, de manera que pueda cifrar y descifrar los detalles correctamente o utilizar alguna otra clave compartida.
  3. Es probable que desee tener un mecanismo en el lugar para recuperar los usuarios ReturnUrl del servidor original para que pueda enviarlos de vuelta al lugar correcto.

También puede echar un vistazo a "Forms Authentication Across Applications"

+0

Sé que esta pregunta es antigua, pero estoy luchando con una situación similar. Estoy creando un sitio móvil y lo necesito para compartir la autenticación con el sitio principal (un sitio existente). Seguí las sugerencias en el artículo que vinculó al final, pero todavía no tuve suerte. Intenté agregar el atributo 'domain = '. Example.com" '(reemplazado por el dominio del sitio principal), pero ahora parece que la autenticación no funciona en absoluto. (Cerrar sesión no tiene ningún efecto, incluso borré las cookies de los navegadores.) Consideraría pagar una tarifa de consultoría razonable si pudiera dedicar algún tiempo a ayudarme. –

+0

El paso 2 suena un poco sospechoso ... encriptar los detalles de inicio de sesión y redirigirlos a una página conocida en el segundo dominio ... hmmm ... un hacker podría interceptar los datos cifrados entre su servidor y el cliente, luego iniciar sesión la cuenta de la víctima desde el segundo dominio usando esa información encriptada. Ni siquiera tendrían que descifrar los datos. Simplemente utilizarían el código javascript del lado del cliente e inyectarían los datos cifrados en su propio sistema, y ​​luego lo comprometerían. Incluso si hiciera que los datos encriptados caduquen en milisegundos, el pirata informático podría ser más rápido que el usuario al que se redirigirá. –

+0

Hola Mark, de hecho, idealmente todo esto debería ser a través de SSL, lo que debería mitigar la mayoría de esas preocupaciones. De hecho, los datos encriptados deben vivir más de milisegundos mientras hablamos de tráfico de red y latencia. No estoy seguro de dónde vino el supuesto de JavaScript (podría haber sido más específico) estábamos emitiendo redireccionamientos '302' como una respuesta que haría que el navegador emitiera la solicitud apropiada al siguiente servidor de la cadena; sin embargo, si recuerdo correctamente, todavía confiaba en cadenas de consulta, de ahí el uso de SSL. Entonces estábamos más limitados a los compromisos de SSL. –

-4

Debe leer Explained: Forms Authentication en MSDN. Cubren la autenticación de dominios cruzados.

+4

@Filip, ¿en qué parte de ese documento se refiere a la autenticación entre dominios? Revisé el documento y no puedo encontrar ninguna información al lado de los puntos que parecen impedir la autenticación entre dominios. Hay un enlace a un artículo que habla sobre la autenticación en múltiples dominios AD, que obviamente es un espacio problemático diferente. – Lazarus

3

Puede intentar configurar cookieless="true".

+0

No estoy seguro de cómo esto podría resolver la autenticación de dominio cruzado? –

+1

En lugar de cookies (que están limitadas a un único dominio) envía un ticket de autenticación en la URL. –

+0

@Darin pero el token en la URL todavía está codificado de forma exclusiva para el servidor de autenticación, ¿no? – Lazarus

Cuestiones relacionadas