2010-01-31 37 views
11

Ho un'app con più sottodomini, subone.parent.com, subtwo.parent.com.Cookie sottodominio ASP.NET (principale e un sottodominio)

Ho una pagina di accesso su parent.com/login. Quando un utente effettua l'accesso, li reindirizzo al dominio corretto in base al quale sono membri. Funziona bene

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) 

Questo autentica correttamente l'utente per subone.parent.com e non subtwo.parent.com. Comunque mi piacerebbe fare quanto segue.

Se l'utente torna a parent.com, vorrei sapere che è stato effettuato l'accesso e reindirizzato a subone.parent.com.

Esiste una best practice per realizzare questo? O devo impostare un altro cookie per parent.com?

Sto lavorando in asp.net mvc se è importante.

Grazie!

risposta

5

È possibile condividere i cookie su domini come si sta tentando di fare, ma non è diretto, esempio here.

Un'altra opzione è quella di impostare il cookie come ".parent.com" piuttosto che specificare il sottodominio in modo esplicito e utilizzare la memorizzazione dei cookie i dettagli del sottodominio. Quindi è possibile accedere ai cookie da qualsiasi sottodominio (e dal genitore assumendo il proprio www.parent.com).

Se si utilizza MVC, è possibile creare facilmente un filtro personalizzato e aggiungerlo ai controller di www.parent.com per verificare l'esistenza del cookie e, in tal caso, reindirizzare al dominio secondario specificato dal cookie. Ulteriori dettagli sui filtri here.

+0

Credo che la vostra seconda l'opzione qui potrebbe funzionare. Sto impostando il dominio sul genitore. Ho aggiunto il sottodominio ai dati utente di FormsAuthTicket. Ho creato un'Identità personalizzata che su IsAuthenticated controllerà il dominio corrente rispetto a Dati utente. Cosa ne pensi? – Paul

+0

Il link 15seconds sembra non andare più dove dovrebbe ... –

0

Vorrei impostare il cookie per il dominio esplicito così come è lì perché mantiene tutte le informazioni di sicurezza all'interno del cookie del dominio specifico. È inoltre possibile aggiungere un cookie non crittografato al livello * .parent.com che contiene informazioni su quali domini sono stati autenticati. Non esiste un modo reale per legare questo insieme, anche se senza utilizzare timestamp e con una connessione logica tra le applicazioni (es. - sub2 ha un timeout di sessione di 20 minuti, quindi se il dominio + timestamp valido si verifica nel cookie padre sarebbe valido, tuttavia questa è una logica aziendale).

Non sono sicuro del ragionamento alla base della disconnessione tra domini, ma in realtà si potrebbe preferire un singolo cookie con testo crittografato dietro testo crittografato. EG:

1) Sub1 accede, imposta il cookie parent.com come valido. Invia una parte di dati utente a un servizio Web di autenticazione.

2) Il servizio di autenticazione riconosce sub1 come mittente, crittografa i dati dell'utente e lo aggiunge a un oggetto cookie personalizzato.

3) L'oggetto cookie personalizzato costruisce una stringa composta su un unico carattere di divisione (o sequenza) e lo rende disponibile per il metodo di servizio.

4) Il servizio, utilizzando la crittografia dei moduli, crittografa l'intero ticket e lo invia al login originale.

In questo modo ogni server sarebbe in grado di decodificare il ticket globale, ma ogni pezzo di dati sarebbe crittografato utilizzando un algoritmo comune ma un server basato su sale. Quindi se sub2 tenta di leggere i dati dei cookie da sub1, ottiene la versione crittografata piuttosto che i dati grezzi.

+0

Grazie, se aggiungo un cookie utente non crittografato al livello .parent non può essere alterato/spoofato per consentire l'accesso ad altri sottodomini? – Paul

+0

@Paul: Sort of. Sto suggerendo 2 livelli di crittografia. La prima è la crittografia FormsAuthentication predefinita che mantiene privato l'intero cookie solo per il dominio * .parent.com. Il secondo è una crittografia interna applicata a ciascuna sezione privata del cookie il cui sale è noto solo tra il server principale e il singolo server. Ogni sottodominio avrebbe accesso all'intero cookie, ma non sarebbe in grado di decodificare una sezione appartenente a un sottodominio diverso. FormsAuthentication.IsAuthenticated risulterebbe in un valore "true". –

+0

@Paul: Continua: tenendo presente questo, è necessario aumentare questo controllo con qualcosa che convalida i dati nel cookie stesso. IsAuthenticated && MyCookieData.IsValid (ticket) o qualcosa del genere. –

0

è possibile condividere la stessa sessione su tutti i sottodomini. Questo è il codice che utilizziamo per realizzare questo :-)

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); 
} 

all'interno del metodo Page Load è:

Unload += MasterPage_Unload; 

funziona benissimo :-)

Robert

+0

Grazie Robert, ma non voglio che l'utente sia autenticato su tutti i sottodomini, solo uno e la radice. – Paul

+0

Abbiamo affrontato un problema serio con questa soluzione: ha impedito a 'OutputCache' di lavorare su tutte le pagine che utilizzavano una MasterPage con quel codice. [Questa soluzione qui] (http://stackoverflow.com/a/2088853/177710) ha reso OutputCache funzionante come un fascino. – Oliver

Problemi correlati