2009-09-02 73 views
8

En una de las aplicaciones ASP.NET MVC, nos gustaría cerrar la sesión del usuario automáticamente si cierra la pestaña del navegador en el que se abre la aplicación.Usuario de cierre de sesión cuando la página de pestañas del navegador está cerrada, ASP.NET MVC

Estamos utilizando el siguiente código cuando se autentica.

FormsAuthentication.SetAuthCookie (nombre de usuario, falsa)

A partir de ahora, si se cierra la ventana del navegador y relanzarlo, los usuarios se les pide que autenticarse de nuevo. Pero queremos pedirles a los usuarios que se autentiquen nuevamente si cierran la pestaña e intentan acceder a cualquiera de las URL del sitio web.

+4

Me pregunto la función. ¿Qué sucede si el usuario tiene su sitio abierto en dos pestañas y cierra uno? –

+2

No hay ninguna manera confiable de hacerlo y no veo ningún motivo para implementar dicha * característica *. –

Respuesta

6

Decidimos usar cookies con menos autenticación para que el token de autenticación sea parte de la url. Cuando se cierra la pestaña y abren nuevamente el sitio web, se les pedirá que se autentiquen nuevamente :)

+4

Me temo que esto podría no ser un buen enfoque en el aspecto de SEO. –

+13

Esto significa que los tokens de autenticación se guardarán en muchos más lugares de los que espera, muchos cortafuegos corporativos y otros filtros registran la url. Incluso los registros de su sitio web los mostrarán (lo que significa que le dio a cualquier administrador de red o centro de datos con acceso a archivos básicos la capacidad de hacerse pasar por usuarios copiando la URL del archivo de registro IIS/Apache estándar) – David

3

No he probado esto por mí mismo, pero creo que el siguiente enfoque debería funcionar:

En el lado del cliente, puede utilizar el evento OnUnload de su documento para poner en marcha una función de JavaScript que llame a su lado del servidor método de registro a través de ajax.

En el lado del servidor, debe tener el método de acción llamado FormsAuthentication.SignOut() y Session.Abandon();

+5

Tenga cuidado con esto, sin embargo, ya que el onunload se dispara al navegar fuera de la página también. Y hasta donde yo sé, no hay forma de verificar si el usuario está navegando o cerrándose ... – peirix

+0

la descarga se dispara antes de moverse a cada página del sitio web. Pero quiero manejar la pestaña cerrar. – Gopinath

+1

Lo siento, olvidé que podría no estar escribiendo un sitio web de AJAX. Estoy cargando todo el contenido nuevo a través de llamadas AJAX (usando un plugin de jquery hecho a medida), así que solo obtengo un evento de desbloqueo cuando la pestaña o ventana está cerrada. –

3

Un navegador borra todos los objetos del ámbito de la sesión solo cuando está completamente cerrado y no cuando se cierra una pestaña individual.

Una forma podría ser utilizar un tiempo de espera de sesión muy bajo y tener una secuencia de comandos del lado del servidor cada pocos segundos para golpear un objeto en la página. Esto extenderá el tiempo de la sesión nuevamente. Por lo tanto, si se cierra una pestaña, la secuencia de comandos no puede encontrar el objeto, lo que permite que la sesión exceda el tiempo de espera. Un problema aquí es si su aplicación tiene una carga bastante alta, ¡su aplicación podría ser DoS en sí misma!

1

En realidad, no hay manera de que LogOff el usuario cuando el usuario cierra la pestaña del navegador. La única forma de hacerlo es verificar si el usuario está autenticado cuando llamamos al método LogOn en el Controlador.

Este código es un ejemplo de cómo lo hago en ASP.Net MVC 3.

public ActionResult LogOn() 
     { 
      if (Request.IsAuthenticated) 
      { 
       FormsAuthentication.SignOut(); 
       return RedirectToAction("Index","ProductManager"); 
      } 
      return View();   
     } 
2

Usted puede simplemente utilizar variables de sesión para iniciar la sesión automáticamente a nadie tratando de volver a la página de destino asegurada. Cree una variable de sesión única (entero o booleano) y en el evento onclick de su botón de inicio de sesión reinícielo a un estado conocido después de confirmar que el usuario tiene una credencial válida y luego configure o incremente esa variable de sesión en el evento page_load de la página que intenta para asegurar. Pruebe estos valores y cierre la sesión del usuario si intenta regresar a la página o no hacer nada si no lo hace. El código puede parecerse a esto.

protected void btnLogin_Click(object sender, EventArgs e) 
{ 
     if (IsAuthenticated == true) 
     Session["IsUserLoggedIn"] = (int)0; 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (HttpContext.Current.User.Identity.IsAuthenticated == true) 
       { 
         if (Session["IsUserLoggedIn"] != null) 
         { 
           int IsUserLoggedIn = (int)Session["IsUserLoggedIn"]; 
           if (IsUserLoggedIn <= 0) 
           { 
             Session["IsUserLoggedIn"] = (int)IsUserLoggedIn + 1; 
           } 
           else 
           { 
             Session["IsUserLoggedIn"] = (int)0; 
             FormsAuthentication.SignOut(); 
             FormsAuthentication.RedirectToLoginPage(); 
           } 
         } 
       } 
       else { Session["IsUserLoggedIn"] = (int)0; } 
     } 
+0

Este enfoque tiene un error grave . Después de iniciar sesión, si actualizo la página de inicio donde se implementó Page_Load, se cierra la sesión. –

Cuestiones relacionadas