Fin de la Session dans Global.asax.cs ne s'exécute pas au moyen de formulaires authentification
j'ai un asp.net 4.0 application qui utilise l'authentification forms réglée à un délai de 45 minutes. Je voudrais rediriger l'utilisateur vers une page de timeout lorsque la session est Expirée. Quelqu'un peut me dire comment faire cela? Je suis en cours d'exécution .net 4.0.
web.config a:
<authentication mode="Forms">
<forms name=".ASPXAUTH" loginUrl="~/Login.aspx"
defaultUrl="~/Default.aspx" protection="All" timeout="45"
requireSSL="false">
</forms>
</authentication>
Global.asax.le fichier cs a:
void Session_End(object sender, EventArgs e)
{
Response.Redirect("~/Timeout.aspx");
}
3 réponses
il n'est pas possible de faire une redirection dans la méthode Session_End
. Il ne s'exécute pas à la suite d'une requête, donc il n'a pas d'objet Response
et il n'y a pas de réponse pour 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é requête, il n'y a donc aucun moyen de pousser un message du serveur vers le navigateur sans que le navigateur le demande.
le le navigateur ne peut pas savoir si la session a expiré ou non. Si vous sondez le serveur pour vérifier si la session est Expirée, cela maintiendrait la session en vie, ce qui irait à l'encontre du but de la timeout.
vous pouvez faire une redirection après 45 minutes en utilisant juste le script client:
window.setTimeout(function() {
window.location.href = '/Timeout.aspx';
}, 1000*45*60);
cependant, cela fera la redirection seulement basée sur le temps depuis que cette fenêtre de navigateur a contacté le serveur pour la dernière fois. Si vous avez plus d'une fenêtre de navigateur pour la même session, il est possible que la session n'ait pas été chronométrée.
comment votre session est-elle implémentée? Session_End ne fonctionne que lorsque vous utilisez InProc.
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.
}