Compartir sesión entre dos sitios web usando asp.net y servidor de estado

Tengo dos exactamente los mismos sitios web alojados en dos máquinas diferentes bajo IIS 7.5. El servicio de estado ASP.NET se ejecuta en mi máquina y el web.config se actualiza en ambos sitios con el siguiente código:

 

La conexión remota de permiso se establece en 1 en el registro para que el segundo sitio web pueda acceder al servidor de estado.

Ambos sitios web tienen la misma clave de máquina:

  

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

Lo que quiero hacer es que ambos sitios compartan los mismos datos de sesión, por ejemplo, poder 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 no puedo lograr esta prueba y realmente no puedo entender lo que estoy haciendo mal.

Alguna idea que pueda ayudar?

Necesitará una forma de convencer a su navegador para que envíe la misma cookie de sesión ASP.NET, independientemente del sitio que visite.

Si la cookie no está presente en la solicitud, se creará una nueva sesión con esa clave.

Creo que puede hacer que el navegador retenga la clave con algunas configuraciones DNS engañosas, si asigna http://website1.mydomain.com/ y http://website2.domain.com/ para que sean las direcciones de sus sitios, entonces establecer el dominio de la cookie de sesión de ASP.NET en “dominio.com”, luego su navegador lo enviará a ambos sitios y la sesión se debe compartir.

También puede utilizar el modo sin cookies con ASP.NET y obtener el ID de la sesión a partir de las URL generadas.

Soy consciente de que esta pregunta fue respondida hace 5 años, sin embargo, hoy creo que puedo aportar más información al respecto.

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

En caso de que no pueda usar el servidor SQL por algún motivo, entonces podemos modificar un poco las aplicaciones IIS para que podamos usar la sesión Fuera de proceso, también conocida como modo de estado de sesión StateServer .

Para que funcione, hay varias cosas que hacer bien:

  1. La cookie de sesión de 2 aplicaciones debe establecerse en el mismo nombre de dominio. P.ej
  
  1. La clave de la máquina debe coincidir. Puede hacer un cifrado de campo Web.config estándar para hacerlo más seguro, pero eso es opcional.
  
  1. Modo de estado de sesión configurado en servidor de estado

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

     ... 
  1. El nombre de la aplicación 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. Simplemente coloque 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 a alguien que no recuerdo quién lo juntó en el comentario de un proyecto de código. Tenga en cuenta que la respuesta de pfemiani no funciona para mí, pero la combina con la publicación de Li Chen.

  2. Asegúrese de que se esté ejecutando el servicio de estado ASP .NET . Aquí es donde se guardarían los datos de la sesión ahora.

Compartir sesión entre dos aplicaciones web asp.net

Por favor, consulte la siguiente URL

http://www.freshcodehub.com/Article/48/sharing-session-between-two-aspnet-web-applications