2010-08-09 20 views
10

que tiene dos exactamente los mismos sitios web alojados en dos máquinas diferentes en IIS 7.5. servicio de estado de ASP.NET se ejecuta en mi máquina y el web.config se actualiza en ambos sitios con el siguiente código:sesión entre dos sitios web utilizando asp.net y el estado del servidor

<sessionState mode="StateServer" stateConnectionString="tcpip=192.168.1.77:42424" cookieless="false" timeout="120"/> 

La permitir la conexión remota se establece en 1 en el registro para que el segundo sitio Web para acceder al servidor de estado

Ambos sitios web tienen la misma clave de equipo:

<machineKey validationKey="7CB8DF6872FB6B35DECD3A8F55582350FEE1FAB9BE6B930216056C1B5BA69A4C5777B3125A42C4AECB4419D43EC12F168FD1BB887469798093C3CAA2427B2B89" decryptionKey="02FC52E4C71544868EE297826A613C53537DF8FDAF93FA2C64E9A5EF0BA467FB" validation="SHA1" decryption="AES" /> 

Además ambos sitios están configurados en IIS para tener el mismo identificador.

Lo que quiero hacer es que estos dos sitios comparten los mismos datos de la sesión, por ejemplo, ser capaz de hacer lo siguiente:

// At web site 1: 
Session["key"] = "value" 

y

// At web site 2: 
// Read session value from the other web site 
string result = Session["key"] 

El problema es que lo que pueda' Logro lograr esta prueba y realmente no puedo entender lo que estoy haciendo mal.

¿Alguna idea que pueda ayudar?

Respuesta

4

Usted necesitará una manera de convencer al navegador enviar la misma cookie de sesión ASP.NET, independientemente del sitio que visita.

Si la cookie no está presente en la solicitud, a continuación, una nueva sesión será creado con esa clave.

creo que se puede conseguir el navegador para retener la llave con algunas configuraciones DNS furtivos - si asigna http://website1.mydomain.com/ y http://website2.domain.com/ a ser las direcciones de sus sitios, a continuación, establecer el dominio de la cookie de sesión ASP.NET para "dominio. com ", entonces su navegador lo enviará a ambos sitios y la sesión debe ser compartida.

Puede también ser capaz de utilizar el modo sin cookies con ASP.NET, y agarrar el identificador de sesión de las URLs generadas.

+0

Así que si en Firefox cambio de la cookie ASP.NET_SessionId ser exactamente el mismo en ambos urls, por ejemplo, podría funcionar. ¿Derecha? – ppolyzos

+0

Sí, eso creo. También puede usar Fiddler para anular los valores de las cookies en la solicitud. – mwalker

+1

advertencia sobre el modo sin cookies: es muy inseguro. El identificador de sesión es allí en la URL, por lo que la gente simplemente puede agarrar y se registre en la medida que, sin ninguna necesidad de usuario/contraseña. –

10

Soy consciente de que esta pregunta fue respondida hace 5 años, sin embargo, hoy creo que puedo poner un poco más información en ella.

En primer lugar, esta no es la forma oficial de compartir datos de sesión entre 2 aplicaciones de IIS, o la forma más popular. La forma "aparentemente oficial" es use SQL Server session.

En caso de que no pueda usar el servidor SQL por alguna razón, entonces podemos ajustar un poco las aplicaciones IIS para que podamos usar la sesión Fuera de proceso, también conocido como StateServer modo de estado de sesión.

Para que funciona, hay bastantes cosas para hacer a la derecha:

  1. cookie de sesión del 2 de aplicación debe estar configurado en el mismo nombre de dominio. P.ej.
<httpCookies domain=".your.site"/> 
    clave
  1. La máquina debe ser igualada. Usted puede hacer Web.config field encryption norma para que sea más seguro, pero eso es opcional.
<machineKey validationKey="[your_key]" 
    decryptionKey="[your_decryption_key]" validation="SHA1" /> 
    modo de estado de
  1. Sesión ajustado a servidor de estado

Poner (1), (2), (3) juntos:

<system.web> 
    <httpCookies domain=".your.site"/> 
    <machineKey validationKey="your_key" decryptionKey="your_decryption_key" validation="SHA1" /> 
    <sessionState mode="StateServer" timeout="60" /> 
    ... 
  1. A plicación nombre debe coincidir. De lo contrario, solo se podría compartir el ID de la sesión, pero no los datos de la sesión. El problema es que no puede configurar el nombre de su aplicación dentro de Web.config. Sin embargo, podemos crear nuestra propia configuración e inyectarla por reflexión. Sólo hay que poner el siguiente código en Global.asax.cs:

    public override void Init() 
    { 
        base.Init(); 
        try 
        { 
         // Get the app name from config file... 
         string appName = ConfigurationManager.AppSettings["ApplicationName"]; 
         if (!string.IsNullOrEmpty(appName)) 
         { 
          foreach (string moduleName in this.Modules) 
          { 
           IHttpModule module = this.Modules[moduleName]; 
           SessionStateModule ssm = module as SessionStateModule; 
           if (ssm != null) 
           { 
            FieldInfo storeInfo = typeof(SessionStateModule).GetField("_store", BindingFlags.Instance | BindingFlags.NonPublic); 
            SessionStateStoreProviderBase store = (SessionStateStoreProviderBase)storeInfo.GetValue(ssm); 
            if (store == null) //In IIS7 Integrated mode, module.Init() is called later 
            { 
             FieldInfo runtimeInfo = typeof(HttpRuntime).GetField("_theRuntime", BindingFlags.Static | BindingFlags.NonPublic); 
             HttpRuntime theRuntime = (HttpRuntime)runtimeInfo.GetValue(null); 
             FieldInfo appNameInfo = typeof(HttpRuntime).GetField("_appDomainAppId", BindingFlags.Instance | BindingFlags.NonPublic); 
             appNameInfo.SetValue(theRuntime, appName); 
            } 
            else 
            { 
             Type storeType = store.GetType(); 
             if (storeType.Name.Equals("OutOfProcSessionStateStore")) 
             { 
              FieldInfo uribaseInfo = storeType.GetField("s_uribase", BindingFlags.Static | BindingFlags.NonPublic); 
              uribaseInfo.SetValue(storeType, appName); 
             } 
            } 
           } 
          } 
         } 
    
        } 
        catch (Exception ex) 
        { 
         log.Error(ex.Message, ex); 
        } 
    } 
    

    Los créditos van a pfemiani, Li Chen, y alguien que no recuerdo que poner juntos en el comentario de un proyecto de código. Tenga en cuenta que la respuesta de pfemiani no funciona para mí, sin embargo, combinándolo con el poste de Li Chen hace.

  2. Asegúrese ASP .NET state service se está ejecutando. Aquí es donde se guardarían los datos de la sesión ahora.

+2

Esto funcionó para mí. Especialmente el punto # 4 es lo que falta en otras respuestas SO. – muruge

Cuestiones relacionadas