2009-05-13 23 views
10

Inserisco i dati utente nella sessione, quindi li trasferisco a viewdata per visualizzarli su una pagina. Ora, quando il mio utente si allontana per un po 'dal suo computer, la sessione finisce ei dati che ha inserito sono persi (è ok) Il problema è che quando ritorna aggiorna lo schermo che la mia pagina sta ancora mostrando ma tutti i dati sono andato. Così,Fine sessione in ASP.net MVC

Come posso reindirizzare l'utente a una schermata di login quando la sessione scade (così egli pretende molto vedere una pagina vuota) o vorrei lo reindirizzare ad una pagina che indica "Sei stato disconnesso causa di prolungata inattività ".

Grazie

risposta

15

faccio uso di JavaScript nel mio MasterPage per reindirizzare l'utente (dopo una richiesta di rinnovare la sessione) per l'azione di logout. Utilizza una richiesta AJAX per tornare alla pagina iniziale dell'app per aggiornare la finestra della sessione lato server quando l'utente fa clic sul pulsante nella finestra di dialogo per estendere la sessione. Si affida a jQuery e all'interfaccia utente jQuery per la finestra di dialogo.

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

È possibile utilizzare Session_End in Global.asax per questo? –

+0

Non vedo come si reindirizza il browser a una pagina diversa dall'evento Session_End a meno che il browser non controlli periodicamente per vedere se la sessione è attiva. Sfortunatamente, facendo fare al browser ciò manterrà la sessione in modo artificioso poiché verrà aggiornata su ogni query. Sto lavorando per trasformare questo in un plugin jQuery. – tvanfosson

+0

Correggetemi se ho torto ma Session_End viene eseguito in un thread in background e come tale non può comunicare con l'utente. ama il tuo lavoro tvanfosson, il tuo approccio funziona molto bene – CodeKiwi

6

sto supponendo che si sta autenticare l'utente, in qualche modo, ma stai usando autenticazione moduli ?:

ASP.Net MVC Framework - Using Forms Authentication

Se stai già utilizzando autenticazione basata su form, è necessario assicurati che il tempo di scadenza del cookie di autenticazione sia un po 'più breve del tuo timeout di sessione.

+0

Sì, sto usando il progetto MVC predefinito come base. –

+0

YUK! Odio quando i siti mi disconnettono tutto il tempo. Pensaci attentamente prima di implementare questo o no. La natura del tuo sito sarà ovviamente il fattore decisivo :) –

0

I dati potrebbero rimanere nella pagina perché il browser la sta memorizzando nella cache.

provare a lanciare questo e vedere se i dati sono ancora lì dopo la sessione è morto:

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

ho avuto quel stesso problema con un vecchio ASP.net app. La sessione scade ma l'utente è ancora autenticato perché i cookie di sessione e di autenticazione sono diversi e non necessariamente scadono allo stesso tempo. Quello che ho fatto allora era usare il global.asax Session_Start per verificare se l'utente era autenticato e disconnetterlo.

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

Questo costringe un utente a iniziare una sessione per accedere di nuovo. Puoi anche utilizzare questo evento per recuperare le informazioni sulla sessione dal database, o magari redirigerlo su un'altra pagina ma mantenere valide le sue credenziali.

+0

Il timeout della sessione è una funzione del server web? (IIS6) Può essere modificato solo da lì nel pannello di controllo? –

+0

Ho provato questo codice, mi ha disconnesso ma Response.Redirect non mi ha portato alla mia pagina. –

+0

È possibile modificare la scadenza della sessione sul proprio web.config o utilizzando la sessione a livello di programmazione.Timeout = x; se si disconnette, è possibile accedere solo alla pagina di accesso o a una pagina non protetta da Autenticazione. –