2009-05-13 12 views
10

Je place des données utilisateur dans la session, puis je les passe à viewdata pour les afficher sur une page. Maintenant, quand mon utilisateur s'éloigne de son ordinateur pendant un moment, la session se termine et les données qu'il a saisies sont perdues (c'est ok) Le problème est que quand il revient il actualise l'écran, ma page est toujours affichée mais toutes les données sont disparu. Comment puis-je rediriger l'utilisateur vers un écran de connexion à l'expiration de la session (il ne voit donc pas de page blanche) ou le rediriger vers une page indiquant "Vous avez été déconnecté pour cause d'inactivité" ".Fin de session dans ASP.net MVC

Merci

Répondre

15

J'utilise quelques scripts JavaScript dans mon MasterPage pour rediriger l'utilisateur (après une demande de renouvellement de la session) à l'action de fermeture de session. Il utilise une demande AJAX à la page d'accueil de l'application pour actualiser la fenêtre de session côté serveur lorsque l'utilisateur clique sur le bouton dans la boîte de dialogue pour étendre la session. Se base sur jQuery et jQuery UI pour la boîte de dialogue.

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

Le paramètre Session_End dans Global.asax peut-il être utilisé pour cela? –

+0

Je ne vois pas comment vous redirigeriez le navigateur vers une page différente de l'événement Session_End à moins que le navigateur vérifie périodiquement si la session est active. Malheureusement, si le navigateur fait cela, la session sera maintenue artificiellement car elle sera mise à jour à chaque requête. Je travaille à transformer ceci en un plugin jQuery. – tvanfosson

+0

Corrigez-moi si je me trompe mais Session_End s'exécute dans un thread d'arrière-plan et ne peut donc pas communiquer avec l'utilisateur. aimez votre travail tvanfosson, votre approche fonctionne très bien – CodeKiwi

6

Je suppose que vous authentifier l'utilisateur d'une certaine façon, mais utilisez-vous ?: authentification par formulaire

ASP.Net MVC Framework - Using Forms Authentication

Si vous utilisez déjà l'authentification par formulaire, vous devez assurez-vous que l'expiration du cookie d'authentification est un peu plus courte que celle de votre session.

+0

Oui, j'utilise le projet MVC par défaut comme ma base. –

+0

YUK! Je déteste quand les sites me déconnectent tout le temps. Réfléchissez bien avant de l'implémenter ou non. La nature de votre site sera le facteur décisif bien sûr :) –

0

Les données pourraient être encore sur la page parce que le navigateur le met en cache.

Essayez de lancer ce et voir si les données sont toujours là après la session est mort:

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

J'ai eu le même problème avec une ancienne application ASP.net. La session expire mais l'utilisateur est toujours authentifié car les cookies de session et d'authentification sont différents et ne sont pas nécessairement expirés en même temps. Ce que j'ai fait à l'époque, c'était utiliser global_asax Session_Start pour vérifier si l'utilisateur était authentifié et le déconnecter.

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

Cela force un utilisateur à démarrer une session pour se reconnecter. Vous pouvez également utiliser cet événement pour récupérer des informations de session à partir de la base de données, ou peut-être le rediriger vers une autre page, mais conserver ses informations d'identification valides.

+0

Le délai d'expiration de la session est-il une fonction du serveur Web? (IIS6) Peut-il seulement être changé à partir de là dans le panneau de contrôle? –

+0

J'ai essayé ce code, il m'a déconnecté mais le Response.Redirect ne m'a pas amené sur ma page. –

+0

Vous pouvez modifier l'expiration de la session sur votre web.config ou en utilisant la session par programme.Timeout = x; Si vous vous déconnectez, vous ne pouvez accéder qu'à la page de connexion ou à une page qui n'est pas protégée par l'authentification. –

Questions connexes