2010-08-09 8 views
10

Ich habe zwei genau die gleichen Websites in zwei verschiedenen Rechnern unter IIS 7.5 gehostet. ASP.NET-Statusdienst wird auf meinem Rechner läuft und die web.config in beiden Seiten mit dem folgenden Code aktualisiert:Share Sitzung zwischen zwei Websites mit asp.net und State Server

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

Die ermöglichen Remote-Verbindung zu 1 in der Registrierung, um für die zweite Website gesetzt um auf den Statusserver zuzugreifen.

Beide Web-Sites haben die gleiche Maschine Schlüssel:

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

Zusätzlich beide Standorte in IIS konfiguriert werden, um die gleiche Kennung haben.

Was will ich zu tun ist, dass diese beiden Websites die gleichen Session-Daten zum Beispiel teilen zu tun in der Lage, die folgenden:

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

und

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

Das Problem ist, dass ich kann‘ t schaffen, diesen Test zu vollenden und wirklich nicht zu verstehen, was ich falsch mache.

Irgendeine Idee, die helfen könnte?

Antwort

4

Sie müssen Ihren Browser davon überzeugen, dasselbe ASP.NET-Sitzungscookie zu senden, unabhängig davon, welche Site es besucht.

Wenn der Cookie nicht in der Anfrage vorhanden ist, wird eine neue Sitzung mit diesem Schlüssel erstellt.

Ich glaube, Sie den Browser den Schlüssel mit einigen hinterhältigen DNS-Konfigurationen zu halten bekommen - wenn Sie zuweisen http://website1.mydomain.com/ und http://website2.domain.com/ die Adressen Ihrer Websites zu sein, stellen Sie dann die Domäne des ASP.NET Session-Cookie auf „Domäne. com ", dann sendet Ihr Browser es an beide Seiten und die Sitzung sollte geteilt werden.

Sie können auch den cookieless-Modus mit ASP.NET verwenden und die Sitzungs-ID aus den generierten URLs abrufen.

+0

Also, wenn in Firefox ändere ich das ASP.NET_SessionId Cookie genau in beiden gleich sein URLs zum Beispiel könnte es funktionieren. Recht? – ppolyzos

+0

Ja, ich denke schon. Sie können Fiddler auch verwenden, um die Cookie-Werte für die Anforderung zu überschreiben. – mwalker

+1

Warnung vor cookieless-Modus: Es ist sehr unsicher. Die Sitzungs-ID ist in der URL enthalten, sodass die Benutzer sie einfach abrufen und sich wie Sie anmelden können, ohne dass ein Benutzer/Passwort erforderlich ist. –

10

Ich bin mir bewusst, dass diese Frage vor 5 Jahren beantwortet wurde, aber heute denke ich, dass ich etwas mehr Informationen hineinbringen kann.

Erstens ist dies nicht der offizielle Weg, um Sitzungsdaten zwischen 2 IIS-Anwendungen oder dem beliebtesten Weg zu teilen. Der "scheinbar offizielle" Weg ist use SQL Server session.

Wenn Sie SQL Server aus irgendeinem Grund nicht verwenden können, dann können wir die IIS-Anwendungen ein wenig optimieren, so dass wir Out-of-Process-Sitzung verwenden können, aka StateServer Sitzungsstatusmodus.

Damit es funktioniert, gibt es durchaus ein paar Dinge richtig zu machen:

  1. Session-Cookie von 2 Antrag muss bei gleichem Domain-Namen festgelegt werden. Z.B.
<httpCookies domain=".your.site"/> 
  1. Maschinenschlüssel angepasst werden müssen. Sie können Standard Web.config field encryption tun, um es sicherer zu machen, aber das ist optional.
<machineKey validationKey="[your_key]" 
    decryptionKey="[your_decryption_key]" validation="SHA1" /> 
  1. Session State-Modus zu State-Server eingestellt

Putting (1), (2), (3) zusammen:

<system.web> 
    <httpCookies domain=".your.site"/> 
    <machineKey validationKey="your_key" decryptionKey="your_decryption_key" validation="SHA1" /> 
    <sessionState mode="StateServer" timeout="60" /> 
    ... 
  1. A Der Name der Anwendung muss übereinstimmen. Wenn nicht, könnte nur die Sitzungs-ID freigegeben werden, aber keine Sitzungsdaten. Das Problem besteht darin, dass Sie Ihren Anwendungsnamen nicht innerhalb von Web.config konfigurieren können. Aber wir können unsere eigene Konfiguration erstellen und sie dann durch Reflektion injizieren. Legen Sie einfach den folgenden Code 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); 
        } 
    } 
    

    Credits gehen zu pfemiani, Li Chen, und jemand, den ich nicht mehr daran erinnern kann, wer sie zusammen in einem Code-Projekts Kommentar setzen. Bitte beachten Sie, dass die Antwort von pfemiani bei mir nicht funktioniert, aber die Kombination mit Li Chens Post funktioniert.

  2. Stellen Sie sicher, dass ASP .NET state service ausgeführt wird. Hier werden die Sitzungsdaten gespeichert.

+2

Das hat für mich funktioniert. Besonders Punkt 4 fehlt in anderen SO Antworten. – muruge

Verwandte Themen