2010-12-15 51 views
1

J'ai une application asp.net 4.0 qui utilise l'authentification par formulaires définie sur un délai d'attente de 45 minutes. Je voudrais rediriger l'utilisateur vers une page de délai d'expiration lorsque la session a expiré. Quelqu'un peut-il me dire comment faire cela? Je cours. Net 4.0.Session_End dans Global.asax.cs ne se déclenche pas à l'aide de l'authentification par formulaire

web.config a:

<authentication mode="Forms"> 
    <forms name=".ASPXAUTH" loginUrl="~/Login.aspx" 
    defaultUrl="~/Default.aspx" protection="All" timeout="45" 
    requireSSL="false"> 
    </forms> 
</authentication> 

fichier Global.asax.cs a:

void Session_End(object sender, EventArgs e) 
{ 
    Response.Redirect("~/Timeout.aspx"); 
} 

Répondre

4

Il est impossible de faire une redirection dans la méthode Session_End. Il ne s'exécute pas à la suite d'une demande, il n'a donc pas d'objet Response et il n'y a pas de réponse à rediriger n'importe où.

Il n'est pas possible de faire quoi que ce soit dans le navigateur suite à l'expiration de la session. Le protocole HTTP est orienté sur les demandes. Il est donc impossible d'envoyer un message du serveur au navigateur sans que le navigateur ne le demande.

Le navigateur ne peut simplement pas savoir si la session a expiré ou non. Si vous interrogez le serveur pour vérifier si la session a expiré, la session est maintenue en vie, ce qui annule l'objectif du délai d'expiration.

Vous pouvez faire une redirection après 45 minutes en utilisant uniquement le script client:

window.setTimeout(function() { 
    window.location.href = '/Timeout.aspx'; 
}, 1000*45*60); 

Cependant, cela rendra la redirection uniquement en fonction du temps écoulé depuis la fenêtre du navigateur dernière a contacté le serveur. Si vous avez plusieurs fenêtres de navigateur pour la même session, il est possible que la session n'ait pas expiré.

+0

la redirection peut être un rafraîchissement même, ou une sorte d'appel ajax qui vérifie les données de session. –

+0

Vous avez raison. Vous pensez que je pourrais utiliser quelque chose comme jQuery idleTimer (http://paulirish.com/2009/jquery-idletimer-plugin/), le régler à 45 minutes comme vous l'avez fait avec (window.setTimeout) et rediriger? Vous pensez que cela pourrait bien fonctionner? Je peux attendre 45 minutes d'inactivité et forcer une déconnexion/fin de session/redirection. – capdragon

+0

@krefftc: Je n'ai pas beaucoup lu sur la page que vous avez liée, en raison de ses animations très saccadées et ennuyeuses, mais je pense que le minuteur inactif essaie de savoir si l'utilisateur est actif dans le navigateur ou non. Le timeout de la session ne se soucie pas du tout de ce que l'utilisateur fait dans le navigateur à moins que le navigateur ne récupère quelque chose du serveur, donc ce n'est pas du tout affecté par cela. Ainsi, 'setTimeout' correspondrait mieux à l'expiration de la session sur le serveur. – Guffa

3

Comment est votre état de session mis en œuvre? Session_End ne fonctionne que lorsque vous utilisez InProc.

Voir http://www.eggheadcafe.com/articles/20021016.asp

+0

Je suppose que ce que les formes d'état de session d'authentification utilise. – capdragon

+1

Formulaires Authentification! = État de la session. –

+0

En tout cas, la valeur par défaut est InProc. Vous auriez à le changer manuellement à SQL Server ou autre. Oui, je sais que c'est 7 ans plus tard, mais je m'en fous. –

0

Sur MVC vous pouvez ajouter ce code dans _ViewStart.cshtml

_ViewStart.cshtml:

@{ 
    Response.AddHeader("Refresh",Convert.ToString((Session.Timeout * 60) + 5));  

    if(Session.IsNewSession) 
     Response.Redirect(“Logout.aspx");// or another page which you want. 
} 

How to Redirect on Session End