2010-01-31 15 views
11

Ich habe eine App mit mehreren Subdomains, subone.parent.com, subtwo.parent.com.ASP.NET Subdomain Cookie (Eltern und eine Subdomain)

Ich habe eine Anmeldeseite bei parent.com/login. Wenn sich ein Benutzer anmeldet, leite ich ihn an die richtige Domäne um, auf der er Mitglied ist. Das funktioniert gut.

FormsAuthenticationTicket ticket = new FormsAuth... 
string encTicket = FormsAuthentication.Encrypt(ticket); 
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket); 
cookie.Domain = subone.parent.com 
Response.Cookies.Add(cookie) 

Dies authentifiziert den Benutzer ordnungsgemäß für subone.parent.com und nicht subtwo.parent.com. Ich möchte jedoch Folgendes tun.

Wenn der Benutzer zurück zu parent.com geht, würde ich gerne wissen, dass sie eingeloggt sind und sie zurück zu subone.parent.com umleiten.

Gibt es eine Best Practice, um dies zu erreichen? Oder muss ich einen weiteren Cookie für parent.com setzen?

Ich arbeite in asp.net mvc, wenn es darauf ankommt.

Vielen Dank!

Antwort

5

Sie können Cookies über Domänengrenzen hinweg teilen, wie Sie es versuchen, aber es ist nicht einfach, Beispiel here.

Eine weitere Option ist, den Cookie als ".parent.com" festzulegen, anstatt die Subdomäne explizit anzugeben und den Cookie-Speicher für die Details der Subdomain zu verwenden. Dann können Sie von jeder Ihrer Subdomains aus auf das Cookie zugreifen (und Eltern, die ihre www.parent.com annehmen).

Wenn Sie MVC verwenden, können Sie ganz einfach einen benutzerdefinierten Filter erstellen und zu den www.parent.com-Controllern hinzufügen, um nach dem Vorhandensein des Cookies zu suchen. Wenn dies der Fall ist, wird der Cookie an die Unterdomäne weitergeleitet. Weitere Details der Filter here.

+0

Ich denke, Ihre zweite Option hier kann funktionieren. Ich setze die Domain auf die Eltern. Ich habe die Subdomain zu den FormsAuthTicket-Benutzerdaten hinzugefügt. Ich habe eine CustomIdentity erstellt, die auf IsAuthenticated die aktuelle Domäne anhand der Benutzerdaten überprüft. Was denken Sie? – Paul

+0

Die 15 Sekunden Verbindung scheint nicht mehr dorthin zu gehen, wo sie hingehört .. –

0

Ich würde den Cookie für die explizite Domäne wie Sie dort festlegen, da diese alle Sicherheitsinformationen im Cookie dieser bestimmten Domäne verwaltet. Sie können auch ein nicht verschlüsseltes Cookie auf der Ebene * .parent.com hinzufügen, das Informationen darüber enthält, welche Domänen authentifiziert wurden. Es gibt keine echte Möglichkeit, dies miteinander zu verknüpfen, ohne Zeitstempel zu verwenden und eine logische Verbindung zwischen den Anwendungen herzustellen (dh - sub2 hat ein Sitzungszeitlimit von 20 Minuten. Wenn die Domäne + gültige Zeitmarke im übergeordneten Cookie auftritt, wäre es gültig. Dies ist jedoch Geschäftslogik).

Ich bin mir nicht sicher über die Gründe für die Trennung zwischen den Domains, aber vielleicht bevorzugen Sie lieber einen einzelnen Cookie, der hinter verschlüsseltem Text verschlüsselt ist. ZB:

1) Sub1 meldet sich an, setzt das Cookie von parent.com als gültig. Sendet ein Stück Benutzerdaten an einen Authentifizierungswebdienst.

2) Der Authentifizierungsdienst erkennt Sub1 als Absender, verschlüsselt die Benutzerdaten und fügt sie einem benutzerdefinierten Cookie-Objekt hinzu.

3) Das benutzerdefinierte Cookie-Objekt erstellt eine zusammengesetzte Zeichenfolge in einem eindeutigen aufgeteilten Zeichen (oder einer Sequenz) und stellt es der Servicemethode zur Verfügung.

4) Der Dienst verschlüsselt mithilfe der Formularverschlüsselung das gesamte Ticket und sendet es an die ursprüngliche Anmeldung zurück.

So könnte jeder Server das globale Ticket entschlüsseln, aber jedes Datenstück würde mit einem gemeinsamen Algorithmus verschlüsselt werden, aber einem serverbasierten Salt. Wenn also Sub2 versucht, die Cookie-Daten von Sub1 zu lesen, erhält es die verschlüsselte Version anstelle von Rohdaten.

+0

Danke, wenn ich ein unverschlüsseltes Benutzer-Cookie auf der .parent-Ebene hinzufüge, könnte das nicht geändert/gefälscht werden, um den Zugriff auf andere Subdomains zu erlauben? – Paul

+0

@Paul: Sortieren von. Ich schlage 2 Verschlüsselungsstufen vor. Die erste ist die standardmäßige FormsAuthentication-Verschlüsselung, die Ihr gesamtes Cookie nur für die Domäne * .parent.com privat hält. Die zweite ist eine interne Verschlüsselung, die auf jeden privaten Abschnitt des Cookies angewendet wird, dessen Salt nur zwischen dem Master-Server und dem einzelnen Server bekannt ist. Jede Subdomain hätte Zugriff auf den gesamten Cookie, aber sie könnten einen Abschnitt, der zu einer anderen Subdomain gehört, nicht entschlüsseln. FormsAuthentication.IsAuthenticated würde zu einem "True" -Wert führen. –

+0

@Paul: Fortsetzung - in Anbetracht dieser Tatsache, müssten Sie diese Überprüfung mit etwas, das die Daten in der eigentlichen Cookie selbst validiert. IsAuthenticated && MyCookieData.IsValid (Ticket) oder so ähnlich. –

0

Sie könnten die gleiche Sitzung auf allen Subdomains teilen. Das ist der Code, den wir, dass :-)

void MasterPage_Unload(object sender, EventArgs e) 
{ 
    ///ASP.NET uses one cookie per subdomain/domain, 
    ///we need one cookie for _all_ subdomains. 
    if (Context.Response.Cookies["ASP.NET_SessionId"] == null) 
     return; 

    var sessionCookie = new HttpCookie("ASP.NET_SessionId", Context.Session.SessionID); 
    sessionCookie.Domain = ".yourdomain.com" ; 
    Context.Response.SetCookie(sessionCookie); 
} 

innerhalb der Page_Load-Methode zu erreichen, verwenden ist:

Unload += MasterPage_Unload; 

es funktioniert super :-)

robert

+0

Danke Robert, aber ich möchte nicht, dass der Benutzer auf allen Subdomains authentifiziert wird, nur der eine und der Root. – Paul

+0

Wir hatten ein ernstes Problem mit dieser Lösung: Es behielt den 'OutputCache' davon ab, auf allen Seiten zu arbeiten, die eine MasterPage mit diesem Code benutzten. [Diese Lösung hier] (http://stackoverflow.com/a/2088853/177710) hat bewirkt, dass OutputCache wie ein Charme funktioniert. – Oliver