J'ai une application ASP.NET MVC4 où j'implémente sessionTimeout comme:
<configuration>
<system.web>
<sessionState timeout="2"></sessionState>
</system.web>
</configuration>
Et en authentification:
<configuration>
<system.web>
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn" timeout="1" />
</authentication>
</system.web>
</configuration>
Une fois la session expirée (2 minutes), je dois rediriger vers la page de connexion, mais la redirection ne se produit pas.
Comment puis-je changer le code pour qu'il redirige?
Une façon est qu'en cas d'expiration de la session, dans chaque action, vous devez vérifier sa session et si elle est nulle, puis rediriger vers la page de connexion.
Mais c'est une méthode très mouvementée Pour surmonter cela, vous devez créer votre propre ActionFilterAttribute
qui le fera, il vous suffit d'ajouter cet attribut dans chaque méthode d'action.
Voici la classe qui remplace ActionFilterAttribute.
public class SessionExpireFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpContext ctx = HttpContext.Current;
// check if session is supported
CurrentCustomer objCurrentCustomer = new CurrentCustomer();
objCurrentCustomer = ((CurrentCustomer)SessionStore.GetSessionValue(SessionStore.Customer));
if (objCurrentCustomer == null)
{
// check if a new session id was generated
filterContext.Result = new RedirectResult("~/Users/Login");
return;
}
base.OnActionExecuting(filterContext);
}
}
Ensuite, en action, ajoutez simplement cet attribut comme suit:
[SessionExpire]
public ActionResult Index()
{
return Index();
}
Cela vous fera travailler.
Je découvre un moyen très simple de rediriger la page de connexion à la fin de la session dans MVC. Je l'ai déjà testé et cela fonctionne sans problème.
En bref, j'attrape la fin de la session dans _Layout 1 minute avant et fais la redirection.
J'essaie de tout expliquer étape par étape.
Si nous voulons mettre fin à la session 30 minutes après et rediriger vers loginPage, voir ces étapes:
Modifiez la configuration Web comme ceci (réglez 31 minutes):
<system.web>
<sessionState timeout="31"></sessionState>
</system.web>
Ajoutez ce JavaScript dans _Layout
(lorsque la session se termine 1 minute avant que ce code ne redirige, il compte le temps après la dernière action de l'utilisateur, pas la première visite sur le site)
<script>
//session end
var sessionTimeoutWarning = @Session.Timeout- 1;
var sTimeout = parseInt(sessionTimeoutWarning) * 60 * 1000;
setTimeout('SessionEnd()', sTimeout);
function SessionEnd() {
window.location = "/Account/LogOff";
}
</script>
Voici mon action LogOff, qui ne fait que LogOff et redirige LoginIn Page
public ActionResult LogOff()
{
Session["User"] = null; //it's my session variable
Session.Clear();
Session.Abandon();
FormsAuthentication.SignOut(); //you write this when you use FormsAuthentication
return RedirectToAction("Login", "Account");
}
J'espère que c'est un code très utile pour vous.
Il existe une solution générique:
Disons que vous avez un contrôleur nommé Admin où vous mettez du contenu pour les utilisateurs autorisés.
Ensuite, vous pouvez remplacer les méthodes Initialize
ou OnAuthorization
du contrôleur d'administration et écrire la redirection vers la logique de la page de connexion lors de l'expiration de la session dans ces méthodes, comme décrit:
protected override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext)
{
//lets say you set session value to a positive integer
AdminLoginType = Convert.ToInt32(filterContext.HttpContext.Session["AdminLoginType"]);
if (AdminLoginType == 0)
{
filterContext.HttpContext.Response.Redirect("~/login");
}
base.OnAuthorization(filterContext);
}