2009-10-29 11 views
5

Sto sviluppando una piccola applicazione Web, utilizzata in un computer condiviso.Il cookie di autenticazione ASP.NET non viene eliminato dopo la chiusura di Firefox

Quando l'utente chiude la finestra del browser, voglio che la sessione e l'autenticazione siano cancellate.

Nella pagina di accesso uso qualcosa di simile per autenticare l'utente:

FormsAuthenticationTicket authTicket = 
     new FormsAuthenticationTicket(1,txtUser.Text, 
            DateTime.Now, 
            DateTime.Now.AddMinutes(5), 
            false,""); 

string encTicket = FormsAuthentication.Encrypt(authTicket); 
HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket); 
HttpContext.Current.Response.Cookies.Add(faCookie); 
string redirectUrl = FormsAuthentication.GetRedirectUrl(txtUser.Text, false); 
HttpContext.Current.Response.Redirect(redirectUrl); 

Come potete vedere, ho impostare la variabile "isPersistent" per falso.

Sembra funzionare su Chrome (non testato su IE), tuttavia, quando eseguo l'app su Firefox, con più schede attivate, se chiudo il browser e apro di nuovo, sono ancora autenticato e il cookie è ancora lì!

È davvero strano, perché il cookie dovrebbe essere rimosso alla chiusura ... Si tratta di un bug di Firefox, quando sono aperte più schede? Come posso risolvere questo?

L'aiuto è molto apprezzato!

Grazie in anticipo

risposta

0

Grazie per i suggerimenti ragazzi, ma sono sicuro che sto chiudendo il browser, senza più finestre relative a Firefox aperte.

Leggendo this, sembra che questo è il comportamento browser predefinito, scelto dai Firefox 3 progettisti ...

Sembra memorizza sui cookie disco suppone sia memorizzato su RAM, per recuperare le schede quando apri nuovamente il browser. Quindi se vuoi eliminare la sessione, devi chiudere tutte le schede e poi il browser ...

Penso che questo possa causare alcuni difetti relativi alla sicurezza dell'autenticazione, ad esempio, qualcuno sta usando l'applicazione, finisce il lavoro e lascia, chiudendo il browser, e non le schede. Poiché il computer è condiviso, subito dopo che un altro utente apre il browser, vedrà tutte le schede, con la sessione precedente ripristinata ...

0

Solo una supposizione selvaggia: assicurarsi che non hai la finestra di Firefox Download ancora aperta ...

4

Stai chiusura del browser, o semplicemente la scheda uno? Devi chiudere l'intero browser. Se sono aperte più finestre del browser di livello superiore, è necessario chiuderle tutte. Inoltre, tutte le altre finestre che fanno parte del processo FireFox devono essere chiuse: Download, Intestazioni HTTP Live, Visualizza origine pagina, ecc.

2

Invece di fare affidamento su Mozilla o altri browser, ti consiglio di utilizzare questo codice per eliminare i cookie:

if (Request.Cookies["UserSettings"] != null) 
{ 
    HttpCookie myCookie = new HttpCookie("UserSettings"); 
    myCookie.Expires = DateTime.Now.AddDays(-1d); 
    Response.Cookies.Add(myCookie); 
} 

per ulteriori informazioni riguardo a questo argomento: How to: Delete a Cookie

Edit:

Se si desidera eliminare cookie durante la pagina di scarico, è possibile utilizzare Javascript per realizzare questo:

<html> 
<head> 
    <title></title> 
    <script type="text/javascript"> 
    function deleteCookie() 
    { 
    var d = new Date(); 
    document.cookie = "v0=1;expires=" + d.toGMTString() + ";" + ";"; 
    alert(document.cookie); 
    } 

    </script> 
</head> 

<body onunload="deleteCookie()"> 
... 

</body> 
</html> 

Credo nella vostra situazione JavaScript è la soluzione migliore.

+0

E dove metto quel codice? Perché voglio cancellarlo quando l'utente chiude la finestra, e non trovo alcun gestore per questo. –

+0

@ Tom S.: Secondo la tua domanda, ho cambiato la mia risposta. Spero che sia d'aiuto. – Tarik

+0

Questo non cancellerebbe anche il cookie di sessione ogni volta che clicchi su un link per andare anche a un'altra pagina all'interno del portale? Essenzialmente li costringono ad accedere ancora e ancora per ogni pagina? Tom vuole solo che ciò accada se chiude il browser che non penso possa essere rilevato. – EdenMachine

1

Non utilizzare i cookie, utilizzare la sessione per memorizzare l'utente autenticato e ASP.NET gestirà il cookie di sessione per conto proprio, funziona con FireFox ed è più sicuro.

Ma se si desidera continuare con questo cookie di autenticazione, inserire il codice per rimuoverlo nell'evento Global.asax Session_Start.

protected void Session_Start(object sender, EventArgs e) 
{ 
    HttpContext.Current.Request.Cookies.Remove(FormsAuthentication.FormsCookieName); 
} 
+0

Grande ideia, rimuovendolo quando inizia la sessione! Ma perché usare la sessione è meglio? E come posso archiviare l'utente authenticaded nella sessione? Im utilizzando il sistema di autenticazione di ASP.NET, definendo questo tag in web.config:

+0

Questo in realtà non funziona, perché la sessione ASP.NET non termina in Mozilla se non si chiude la scheda specifica. Se chiudi la finestra senza chiudere la scheda, la sessione è ancora attiva. –

0

Il problema deriva dal fatto che se si imposta una scadenza, si otterrà un cookie persistente, il seguente codice funziona per me dove voglio all'utente di scegliere tra una persistente o browser sessione solo cookie di un la "ricordati di me" casella di controllo quando si accede:

public void SetAuthenticationCookie(LoginView loginModel) 
    { 
     if (!loginModel.RememberMe) 
     { 
     FormsAuthentication.SetAuthCookie(loginModel.Email, false); 
     return; 
     } 
     const int timeout = 2880; // Timeout is in minutes, 525600 = 365 days; 1 day = 1440. 
     var ticket = new FormsAuthenticationTicket(loginModel.Email, loginModel.RememberMe, timeout); 
     //ticket. 
     string encrypted = FormsAuthentication.Encrypt(ticket); 
     var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted) 
     { 
      Expires = System.DateTime.Now.AddMinutes(timeout), 
      HttpOnly = true 
     }; 
     HttpContext.Current.Response.Cookies.Add(cookie); 
    } 
0

Ebbene ho trovato questa soluzione, potrebbe aiutare qualcun altro:

if (Request.Cookies["TownID"] != null) 
{ 
     HttpCookie myCookie = Request.Cookies["TownID"]; 
     myCookie.Expires = DateTime.Now.AddDays(-1d); 
     Response.Cookies.Add(myCookie); 
} 

Fonte: http://forums.asp.net/p/1565112/3895452.aspx

Problemi correlati