2009-05-13 16 views
10

estoy poniendo los datos del usuario en la sesión después de pasarla a ViewData para ver en una página. Ahora, cuando mi usuario se aleja de su computadora por un tiempo, la sesión finaliza y los datos que ingresó se pierden. (Eso está bien) El problema es que cuando regresa actualiza la pantalla, mi página aún se muestra pero todos los datos ido. Entonces,End Session en ASP.net MVC

¿Cómo puedo redirigir al usuario a una pantalla de inicio de sesión cuando vence la sesión (para que no vea una página en blanco) o me gustaría redirigirlo a una página que dice "Usted ha sido desconectado por inactividad" ".

Gracias

Respuesta

15

Consumo Javascript en mi MasterPage para redirigir al usuario (después de un aviso para renovar la sesión) a la acción de cierre de sesión. Utiliza una solicitud AJAX para volver a la página de inicio de la aplicación para actualizar la ventana de sesión del lado del servidor cuando el usuario hace clic en el botón en el cuadro de diálogo para extender la sesión. Se basa en jQuery y jQuery UI para el diálogo.

<% if (this.Request.IsAuthenticated) 
    { 
     int sessionDialogWait = 2 * 60 * 1000 - 60 * 500; // ms = 1.5 minutes 
     int sessionTimeout = 28 * 60 * 1000; // ms = 28 minutes 
     if (ViewData["sessionTimeout"] != null) 
     { 
      sessionTimeout = ((int)ViewData["sessionTimeout"] * 60 - 120) * 1000; 
     } 
%> 
<script type="text/javascript"> 
    var logoutTimer = null; 
    var sessionTimer = null; 
    var sessionTimeout = Number('<%= sessionTimeout %>'); 
    var sessionDialogWait = Number('<%= sessionDialogWait %>'); 

    $(document).ready(function() { 
     $('#sessionEndDialog').dialog({ 
      autoOpen: false, 
      bgiframe: true, 
      modal: true, 
      buttons: { 
       OK: function() { 
        $(this).dialog('close'); 
        $.get('<%= Url.Action("About", "Home") %>', scheduleSessionPrompt, 'html'); 
       }, 
       Logout: logoutOnSessionExpires 
      } 
     }).ajaxStart(function() { scheduleSessionPrompt(); }); 
     scheduleSessionPrompt(); 
    }); 

    function scheduleSessionPrompt() 
    { 
     if (logoutTimer) clearTimeout(logoutTimer); 
     if (sessionTimer) clearTimeout(sessionTimer); 

     sessionTimer = setTimeout(sessionExpiring, sessionTimeout ); 
    } 

    function sessionExpiring() 
    { 
     logoutTimer = setTimeout(logoutOnSessionExpires, sessionDialogWait); 
     $('#sessionEndDialog').dialog('open'); 
    } 

    function logoutOnSessionExpires() 
    { 
     window.location.href = '<%= Url.Action("Logout", "Account") %>'; 
    }  

    </script> 
<% } %> 

<div id="sessionEndDialog" title="Session Expiring" style="display: none;"> 
    <p>Your session is about to expire. Click OK to renew your session or Logout to logout of the application.</p> 
</div> 
+0

¿Puede el Session_End en Global.asax usarse para esto? –

+0

No veo cómo redirigiría el navegador a una página diferente del evento Session_End a menos que el navegador estuviera revisando periódicamente para ver si la sesión está activa. Desafortunadamente, hacer que el navegador haga esto mantendrá artificialmente activa la sesión, ya que se actualizará en cada consulta. Estoy trabajando en convertir esto en un plugin de jQuery. – tvanfosson

+0

Corrígeme si me equivoco, pero Session_End se ejecuta en un hilo de fondo y, como tal, no se puede comunicar con el usuario. encanta su tvanfosson trabajo, su enfoque funciona muy bien – CodeKiwi

6

Estoy asumiendo que estás autenticación del usuario, de alguna manera, pero ¿Está utilizando la autenticación de formularios ?:

ASP.Net MVC Framework - Using Forms Authentication

Si ya está utilizando la autenticación de formularios, es necesario asegúrese de que el tiempo de expiración de la cookie de autenticación sea un poco más corto que el tiempo de espera de la sesión.

+0

Sí, estoy usando el proyecto MVC defecto como mi base. –

+0

YUK! Odio cuando los sitios me desconectan todo el tiempo. Piense con cuidado antes de implementar esto o no. La naturaleza de su sitio será el factor decisivo, por supuesto :) –

0

Los datos podrían estar todavía en la página porque el navegador es el cacheado ella.

Trate de lanzar esto en y ver si los datos son todavía allí después de la sesión ha muerto:

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE"> 
5

tuve el mismo problema con un viejo ASP.net aplicación. La sesión expira pero el usuario aún está autenticado porque las cookies de sesión y autenticación son diferentes y no necesariamente caducan al mismo tiempo. Lo que hice entonces fue usar el session_Start global.asax para verificar si el usuario fue autenticado y desconectarlo.

protected void Session_Start(Object sender, EventArgs e) 
    { 
     if (User.Identity.IsAuthenticated) 
     { 
      FormsAuthentication.SignOut(); 
      Response.Redirect("~/SessionEnd.aspx"); 
     } 
    } 

Esto obliga al usuario a iniciar una sesión para iniciar sesión de nuevo. También puede usar este evento para recuperar información de la sesión de la base de datos, o tal vez redirigirlo a otra página pero mantener sus credenciales válidas.

+0

¿El tiempo de espera de la sesión es una función del servidor web? (IIS6) ¿Se puede cambiar solo desde allí en el panel de control? –

+0

Intenté este código, me lanzó pero el Response.Redirect no me llevó a mi página. –

+0

Puede cambiar expiración de la sesión en su web.config o mediante programación utilizando Sesión.Tiempo de espera = x; si cierra la sesión, solo puede ir a la página de inicio de sesión o a una página que no está protegida por Autenticación. –