web-dev-qa-db-fra.com

Comment rediriger vers la page de connexion lorsque le délai d'expiration de l'état de session est terminé dans asp.net mvc

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?

24
Jonathan

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.

29
user1006544

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:

  1. Modifiez la configuration Web comme ceci (réglez 31 minutes):

     <system.web>
        <sessionState timeout="31"></sessionState>
     </system.web>
    
  2. 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>
    
  3. 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.

23

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);
    }
5
T Gupta