2008-11-07 46 views
12

Tengo una aplicación en la que, en el transcurso del uso de la aplicación, el usuario puede hacer clic desde¿Cómo puedo compartir una sesión en múltiples subdominios en ASP.NET?

virginia.usa.com 

a

newyork.usa.com 

Desde que prefieres no crear una nueva sesión cada vez que un usuario cruza de un subdominio a otro, ¿cuál es una buena forma de compartir información de sesión en múltiples subdominios?

Respuesta

35

te ha etiquetado esto con ASP.NET y IIS, por lo que se asume que es su medio ambiente. Asegúrese de que tiene esto en su web.config:

<httpCookies domain=".usa.com"/> 

Si sus subdominios 2 se asignan a la misma aplicación, entonces se hacen. Sin embargo, si son aplicaciones diferentes, deberá realizar un trabajo adicional, como usar un almacenamiento de sesión basado en SQL Server (y piratear los procedimientos almacenados para asegurarse de que todas las aplicaciones comparten los mismos datos de sesión) o con un HttpModule para interceptar el nombre de la aplicación , ya que incluso con las cookies compartidas y la misma clave de máquina, 2 aplicaciones seguirán usando 2 tiendas diferentes para sus datos de sesión.

+0

Muchas gracias Matt! Hemos utilizado [esta solución] (http://stackoverflow.com/a/2174338/177710) anteriormente, pero no permitió que OutputCaching funcionara. Su solución hace que nuestro OutputCache finalmente funcione :-D – Oliver

+2

Intenté esto en mi servidor local (con el subdominio en mi archivo hosts) y no funciona. Puedo levantar el subdominio fino, pero pasar de uno a otro resultados en la sesión perdida y que el usuario tenga que iniciar sesión de nuevo. ¿Algunas ideas? – Marc

+0

Matt OMG que una línea de código me habría salvado la última semana ...... –

0

Si está usando PHP, un truco sería hacer un pequeño que incluye un script (o dos) para hacer lo siguiente:

1 Serialize sus $ _SESSION gama 2 Pass esa cadena como un campo oculto, haciendo todos sus enlaces a esos botones en formularios separados usando POST. 3 incluirá también una entrada booleana oculta para que el script sepa si tiene que utilizar la sesión actual o unserialize $ _POST [ 'sesión'] 4 Implementar esto a través de su sitio, llamar a las cosas en su caso

que no lo haría Haga esto si hay una forma aprobada de transferir una sesión. Espero que al menos haya considerado usar cookies.

0

No creo que diferentes subdominios en sí mismos fuercen diferentes sesiones. Ambas URL que proporcionó como ejemplos podrían apuntar a la misma aplicación en IIS.

Suena como si tuviera diferentes servidores o al menos diferentes sitios en IIS para cada subdominio. La mejor forma de almacenar un estado persistente como este es en una base de datos central. Encuentro que el servicio Profile en ASP.NET es muy útil para este propósito.

Espero que ayude.

+0

El problema es con la cookie de sesión en el navegador, que está vinculado al dominio –

3

Realice un seguimiento de sus propias sesiones y use una cookie con una configuración de dominio adecuada, es decir. .usa.com.

Alternativamente, si está utilizando PHP, creo que hay una configuración para cambiar la configuración de dominio predeterminada de la cookie de sesión que utiliza, que también puede ser útil.

Los ajustes que está buscando son:

session.use_cookies = 1 
session.use_only_cookies = 1 
session.cookie_domain = .usa.com 
0

La respuesta de Matt es definitivamente el camino a seguir si tiene múltiples subdominios apuntando a la misma aplicación IIS (que es exactamente la situación que tengo ahora, usando el comodín DNS y luego haciendo el subdominio 'sniffing' en el extremo receptor).

Sin embargo, quería agregar algo que experimenté en caso de que alguien descubriera que esto no funciona para ellos.Configurar la línea httpCookies por sí sola no lo hizo por mí, tuve que agregar una entrada machineKey en mi archivo web.config:

machineKey decryptionKey = "12 ... D1" validationKey = "D7..8B"

Particularmente extraño ya que soy no en una configuración de conjunto de servidores (a menos que AWS/EC2 esté actuando efectivamente). Tan pronto como lo hice, funcionó como un campeón.

3

Recientemente fui a través de esto y aprendí por las malas. Localhost en realidad se considera un TLD. Los dominios de cookies requieren al menos un dominio de segundo nivel: test.com. Si desea que las cookies funcionen para un dominio y todos sus subdominios, prefijo con un '.' - .test.com.

Al ejecutar/depurar localmente, establecer un dominio de localhost fallará, y fallará incluso si el dominio está configurado correctamente porque Visual Studio usa localhost de forma predeterminada.

Este localhost predeterminado se puede cambiar en las propiedades del proyecto para que el proyecto se ejecute realmente en el dominio de cookie test.com. Básicamente, si la dirección en el navegador coincide, puede hacer que funcione.

Mi problema está documentado aquí: Setting ServiceStack Cookie Domain in Web.Config Causes Session Id to Change on Every Request

Espero que esto ayude.

Cuestiones relacionadas