Condividi Sessione tra due siti Web utilizzando asp.net e server di stato

Ho due esattamente gli stessi siti web ospitati in due computer diversi in IIS 7.5. Il servizio di stato di ASP.NET è in esecuzione sulla mia macchina e il web.config viene aggiornato in entrambi i siti con il seguente codice:

 

La connessione remota consentita è impostata su 1 nel registro per consentire al secondo sito Web di accedere al server di stato.

Entrambi i siti Web hanno la stessa chiave macchina:

  

Inoltre, entrambi i siti sono configurati in IIS per avere lo stesso identificatore.

Quello che voglio fare è che entrambi questi siti condividano gli stessi dati di sessione, ad esempio potendo fare quanto segue:

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

e

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

Il problema è che non riesco a realizzare questo test e davvero non riesco a capire cosa sto facendo male.

Qualche idea che potrebbe aiutare?

Avrai bisogno di un modo per convincere il tuo browser ad inviare lo stesso cookie di sessione ASP.NET indipendentemente dal sito che visita.

Se il cookie non è presente nella richiesta, verrà creata una nuova sessione con quella chiave.

Penso che si possa ottenere il browser per conservare la chiave con alcune confuse configurazioni DNS, se si assegnano http://website1.mydomain.com/ e http://website2.domain.com/ come indirizzi dei siti, quindi impostare il dominio del cookie di sessione ASP.NET su “dominio.com”, quindi il browser lo invierà a entrambi i siti e la sessione dovrà essere condivisa.

Potresti anche essere in grado di utilizzare la modalità senza cookie con ASP.NET e acquisire l’ID di sessione dagli URL generati.

Sono consapevole che a questa domanda è stata data risposta 5 anni fa, eppure oggi penso di poter inserire qualche informazione in più.

In primo luogo, questo non è il modo ufficiale per condividere i dati di sessione tra 2 applicazioni IIS o il modo più popolare. Il modo “apparentemente ufficiale” è usare la sessione di SQL Server .

Nel caso in cui non sia ansible utilizzare SQL server per qualsiasi motivo, è ansible modificare leggermente le applicazioni IIS in modo da poter utilizzare la sessione Out-of-process, ovvero la modalità stato sessione StateServer .

Per farlo funzionare, ci sono alcune cose da fare bene:

  1. Il cookie di sessione di 2 applicazioni deve essere impostato con lo stesso nome di dominio. Per esempio
  
  1. La chiave della macchina deve essere abbinata. È ansible eseguire la crittografia dei campi standard di Web.config per renderla più sicura, ma è facoltativa.
  
  1. Modalità stato sessione impostata su server di stato

Mettere insieme (1), (2), (3):

     ... 
  1. Il nome dell’applicazione deve essere abbinato . In caso contrario, è ansible condividere solo l’ID di sessione, ma non i dati di sessione. Il problema è che non è ansible configurare il nome dell’applicazione in Web.config. Tuttavia possiamo creare la nostra configurazione e poi iniettarla per riflessione. Basta inserire il seguente codice in 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); } } 

    I crediti vanno a pfemiani , a Li Chen ea qualcuno che non ricordo di averlo messo insieme nel commento di un progetto di codice. Per favore nota che la risposta di pfemiani non funziona per me, eppure combinandola con il post di Li Chen.

  2. Assicurarsi che il servizio di stato di ASP .NET sia in esecuzione. È qui che i dati della sessione verranno salvati ora.

Condivisione della sessione tra due applicazioni web asp.net

Si prega di fare riferimento sotto URL

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