Comment rediriger vers la page de connexion lorsque le temps d'arrêt de la session est terminé dans asp.net mvc

j'ai un ASP.NET application MVC4 où je mets en œuvre sessionTimeout comme:

<configuration>
  <system.web>
    <sessionState timeout="2"></sessionState>
  </system.web>
</configuration>

Et dans d'authentification:

<configuration>
  <system.web>
    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="1" />
    </authentication>
  </system.web>
</configuration>

après l'expiration de la session (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 soit redirigé?

22
demandé sur KyleMit 2012-12-14 09:49:47

3 réponses

d'Une manière qui est En cas d'expiration de Session, dans chaque action vous devez vérifier sa session et si elle est nulle alors rediriger vers la page de connexion.

Mais c'est très mouvementée méthode Pour surmonter cela, vous devez créer votre propre ActionFilterAttribute qui aura pour ce faire, vous avez juste besoin 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);
        }
    }

Puis dans l'action juste ajouter cet attribut comme donc:

[SessionExpire]
public ActionResult Index()
{
     return Index();
}

Cela vous fera du travail.

28
répondu user1006544 2014-07-03 13:27:33

je découvre une façon très simple de rediriger la page de connexion lorsque la session se termine en MVC. J'ai déjà testé et cela fonctionne sans problèmes.

bref, j'attrape la fin de la session dans _Layout 1 minute avant et je fais une redirection.

j'essaie de tout expliquer pas à pas.

si nous voulons que la session se termine 30 minutes après et rediriger vers loginPage voir les étapes:

  1. changez la configuration web comme ceci (mettez 31 minutes):

     <system.web>
        <sessionState timeout="31"></sessionState>
     </system.web>
    
  2. ajouter ce JavaScript dans _Layout (lorsque la session se termine 1 minute avant que ce code ne fasse redirection, il fait compter le temps après la dernière action de l'Utilisateur, pas la première visite sur place)

    <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 redirect 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.

22
répondu Avtandil Kavrelishvili 2016-09-07 15:18:19

Il y a une solution générique:

disons que vous avez un controller nommé Admin où vous mettez du contenu pour les utilisateurs autorisés.

alors, vous pouvez outrepasser le Initialize ou OnAuthorization méthodes du controller Admin et écrire rediriger vers la page de connexion logique de délai d'expiration de session dans ces méthodes comme suit:

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
répondu T Gupta 2013-09-27 10:54:33