2009-10-29 14 views
5

Im desarrollando una pequeña aplicación web, utilizada en una computadora compartida.Cookie de autenticación de ASP.NET que no se elimina después de que se cierre Firefox

Cuando el usuario cierra la ventana del navegador, quiero que se eliminen la sesión y la autenticación.

En la página de conexión i usar algo como esto para autenticar al usuario:

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

Como se puede ver, yo he dado la "isPersistent" variable para falso.

Esto parece funcionar en Chrome (no lo he probado en IE), sin embargo, cuando ejecuto la aplicación en Firefox, con varias pestañas activadas, si cierro el navegador y vuelvo a abrir, todavía estoy autenticado, y la cookie ¡todavía está ahí!

Es realmente extraño, porque la cookie debe eliminarse al cerrarse ... ¿Es esto un error de Firefox, cuando tienes múltiples pestañas abiertas? ¿Cómo puedo arreglar esto?

Ayuda es muy apreciada!

Gracias de antemano

Respuesta

0

Gracias por los consejos chicos, pero estoy seguro de que estoy cerrando el navegador, sin abrir más ventanas relacionadas con Firefox.

Al leer this, parece que este es el comportamiento por defecto del navegador, choosed por los diseñadores Firefox 3 ...

Parece que almacena en las cookies del disco suposed a ser almacenados en la memoria RAM, para recuperar las pestañas cuando abre el navegador nuevamente Por lo tanto, si desea que la sesión se elimine, debe cerrar todas las pestañas, y luego el navegador ...

Creo que esto puede causar algunos errores en la seguridad de autenticación, por ejemplo, alguien está usando la aplicación, termine el trabajo y se va, al cerrar el navegador, y no las pestañas. Dado que la computadora se comparte, inmediatamente después de que otro usuario abra el navegador, y verá todas las pestañas, con la sesión anterior restaurada ...

0

Sólo una conjetura salvaje: asegúrese de que usted no ha conseguido la ventana de Firefox Descargas todavía abierto ...

4

¿Estás cerrando el navegador, o simplemente la pestaña uno? Debes cerrar todo el navegador. Si tiene varias ventanas del navegador de nivel superior abiertas, todas deben estar cerradas. Además, cualquier otra ventana que sea parte del proceso FireFox debe cerrarse también: Descargas, Live HTTP Headers, Ver origen de página, etc.

2

En lugar de confiar en Mozilla o cualquier otro navegador, te recomendaría que utilizar este código para eliminar las cookies:

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

para obtener más información con respecto a este tema: How to: Delete a Cookie

Editar:

Si desea eliminar cookies durante la página de descarga, puede usar JavaScript para lograrlo:

<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> 

Creo que en su situación Javascript es la mejor solución.

+0

¿Y dónde pongo ese código? Porque quiero eliminarlo cuando el usuario cierra la ventana, y no encuentro ningún controlador para esto. –

+0

@Tom S.: Según su pregunta, he cambiado mi respuesta. Espero eso ayude. – Tarik

+0

¿No eliminaría esto también la cookie de sesión cada vez que haga clic en un enlace para ir a otra página dentro del portal también? ¿Esencialmente los obliga a iniciar sesión una y otra vez para cada página? Tom solo quiere que esto suceda si cierran el navegador, lo que no creo que se pueda detectar. – EdenMachine

1

No use cookies, use la sesión para almacenar el usuario autenticado, y ASP.NET administrará la cookie de sesión por usted, funciona con Firefox y es más seguro.

Pero si desea continuar con esta cookie de autenticación, coloque el código para eliminarla en el evento Global.asax Session_Start.

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

¡Gran idea, quitándola cuando comience la sesión! ¿Pero por qué usar sesión es mejor? ¿Y cómo almaceno el usuario autentificado en la sesión? Im usando el sistema de autentificación de ASP.NET, definiendo esta etiqueta en web.config:

+0

En realidad, esto no funciona, porque la sesión de ASP.NET no termina en Mozilla si no cierra la pestaña específica. Si cierra la ventana sin cerrar la pestaña, la sesión aún se activará. –

0

El problema se deriva del hecho de que si se establece una fecha de caducidad, recibirá una cookie persistente, el siguiente código funciona para mí donde yo quiero al usuario elegir entre una persistente o navegador sesión sólo galletas una La "acuérdate de mí" casilla de verificación al iniciar la sesión:

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

Bueno me encontré con esta solución, que podría ayudar a alguien más:

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

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

Cuestiones relacionadas