2011-01-06 6 views
0

Ich habe eine Anwendung mit ASP.NET. Ich habe verschiedene Domains und verschiedene Subdomains. Ich möchte, dass die Domänen die Sitzung mit ihren Subdomains teilen.Speichern Sitzungscookie für Gruppen von Sub-Domänen in ASP.NET IIS7

zum Beispiel Zugriff auf die folgenden Domänen diese Anwendung:
www.example1.com
print.example1.com
www.example2.com
print.example2.com

Wenn ein Benutzer www geht. example1.com und print.example1.com möchte ich dieselbe Sitzung verwenden. Wenn der Benutzer zu www.example2.com und print.example2.com gehen möchte, möchte ich, dass er eine andere Sitzung als das * .example1.com verwendet.

Die Art, wie ich damit umgehen verwendet, um ein Hack in page_load war, die perfekt in IIS6 arbeitet.
Response.Cookies [ "ASP.NET_SessionId"] Value = Session.SessionID;
Response.Cookies ["ASP.NET_SessionId"]. Domäne = SiteUtility.GetCookieDomain();
(SiteUtility.GetCookieDomain zurückkehren würde .example1.com oder .example2.com abhängig von der URL der Anfrage)

Leider ist dies scheint nicht mehr für iis7 zu arbeiten. Jede Subdomain/Domain, zu der ein Benutzer geht, erhält ein neues Session-Cookie.

Ich fand dann den Eintrag web.config:
'< httpCookies domain = ". Example1.com" />.

Dies funktioniert hervorragend für die Freigabe Session-Cookie zwischen example1.com-Subdomains. Leider wird dadurch der Sitzungsstatus für * .example2.com komplett zerstört.

Irgendwelche Ideen, wie ich das lösen kann?

+0

Dank allen für Ihre Hilfe. Ich stellte fest, dass eine der Subdomänen in ie8 in einem vertrauenswürdigen Zustand war, während die andere nicht war. Wenn sich beide in einem vertrauenswürdigen Zustand befinden (und zwar in einem nicht vertrauenswürdigen Zustand), funktioniert es. Pauli verbrachte die meiste Zeit mit mir, also möchte ich ihm die Antwort geben. –

Antwort

0

Haben Sie versucht, eine HttpModule zu schaffen, der die EndRequest -event abfängt, iteriert über die Response.Cookies Sammlung, findet die Session-Cooke und ändert seine Domain Eigenschaft, bevor es tatsächlich an den Client gesendet.

Edit:

Kevin am Ende festgestellt, dass einer der Sub-Domains in einem vertrauenswürdigen Zustand in IE8 war, während der andere nicht. Wenn sich beide in einem vertrauenswürdigen Zustand befinden (und zwar in einem nicht vertrauenswürdigen Zustand), funktioniert es. Ich habe die meiste Zeit damit verbracht, also will Kevin mir die Antwort geben.

+0

Wie würde ich sicher sein, dass der Cookie bei der ersten Anfrage gelesen wird? Möchte ich ein zweites httpModule erstellen, das die Anfrage iteriert? (Lesen auf httpmodules ...) –

+0

Sie sollten sich nicht um BeginRequest kümmern ... alles, was Sie tun müssen, ist sicherzustellen, dass die an den Client gesendeten Cookies die richtigen Domänen gesetzt haben, nein? Zu Ihrer Frage können Sie jedoch ein einzelnes Modul anweisen, auf alle Ereignisse zu reagieren, die Sie benötigen. –

+0

Ich habe mein httpmodul erstellt und es wird korrekt aufgerufen. Leider funktioniert es immer noch nicht domänenübergreifend. Das Seltsame ist, dass der Hack, den ich oben habe, perfekt in iis6 funktioniert. –

0

anstatt SiteUtility.GetCookieDomain(), versuchen Sie es mit:

var domainSansTLD = Request.Url.Host.Replace(".com", ""); 
var secondLevelDomain = domainSansTLD.Substring(domainSansTLD.LastIndexOf('.')); 
var cookieDomain = secondLevelDomain + ".com"; 
+0

Pauli ist richtig, dass diese Endrequest ist in ein Httpmodule setzen wäre viel sauberer als in der page_load –

+0

GetCookieDomain ziemlich tut dies Wow, das sieht schrecklich ... public static string GetCookieDomain() { Uri url = System.Web .HttpContext.Current.Request.Url; Zeichenfolge domain = url.DnsSafeHost; string [] splitDomain = domain.Split ('.'); int splitCount = splitDomain.Count(); System.Text.StringBuilder retVal = neu System.Text.StringBuilder(); für (int i = 1; i

0

Erster Weg,

Shop-Sitzung als Datei an einem Ort, beide Server zugreifen können (dies ist gut für virtuelle Server oder geteilte Ordner). Diese Methode ist ein bisschen unzuverlässig und freigegebene Ordner und Lag, wodurch Probleme verursacht werden.

Okay, ich würde ein paar andere Methoden schreiben, aber ich bin sicher, dass sie veröffentlicht werden, da sie mehr Kenntnisse mit asp.net als ich haben, jedoch habe ich eine persönliche Präferenz, die ich denke würde sei eine gute Option.

Diese Option wäre ein Memcache-Server. Im Wesentlichen ist es eine Datenbank, die aus RAM ausgeführt wird und Sie zeigen alle Ihre Sitzungen darauf (tcp: //mem.domain.com: 1234 ...Entschuldigung, ich kann mich nicht an den üblichen Port von meinem Kopf erinnern.

Ich hoffe, dass ich eine Hilfe war,

Jon

Verwandte Themen