Détection de l'expiration de la Session ASP.NET MVC

j'ai construit un panier qui utilise L'État de Session pour conserver les données du panier pendant que l'utilisateur navigue dans le magasin.

j'ai un problème où si je laisse la fenêtre du navigateur ouverte pendant une longue période sur l'étape 1 du panier, puis appuyez sur "go to step 2", Mes actions jettent une erreur parce que l'action step2 suppose que la session n'a pas expiré et L'objet ShopCart est dans le bon état.

j'aimerais que ce scénario sera plus agréable pour mes utilisateurs, mais je pense que je besoin de détecter d'une façon ou d'une autre si la session a expiré de sorte que sur la prochaine demande, je peux les jeter à L'Étape1.

j'ai trouvé le code suivant, qui prétend résoudre le problème, mais il ne fonctionne pas pour moi.

la condition IsNewSession est vraie mais la condition

if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0)) {
   // handle expired session
}

retourne toujours false et ne gère jamais la session invalide. Je suis confus.

Est-ce possible en ASP.NET (et MVC)?

23
demandé sur Matt 2009-09-29 10:24:13

2 réponses

1

Mettez ce code dans le Init / Load événement de la Page 2...

        if (Context.Session != null)
        {
            if (Context.Session.IsNewSession)
            {
                string sCookieHeader = Request.Headers["Cookie"];
                if ((null != sCookieHeader) && (sCookieHeader.IndexOf("ASP.NET_SessionId") >= 0))
                {

                    if (Request.IsAuthenticated)
                    {
                        FormsAuthentication.SignOut();
                    }
                    Response.Redirect("Error Page");
                }
            }
        }

voie 2

Alternative, vous pouvez vérifier si le Session objet existe avant de continuer à travailler avec elle dans la Page 2, comme ceci:

if (Session["Key"] != null)
{
   Object O1 = (Object) Session["Key"]; 
}
else
{
    Response.Redirect("ErrorPage.aspx");
}
16
répondu The King 2014-11-25 16:37:03

la réponse du Roi ne fonctionne pas pour moi. J'ai ajouté FormsAuthentication.SignOut()OnActionExcuting(). Response.Redirect ne fonctionnera pas!

if (Request.IsAuthenticated)
{
    FormsAuthentication.SignOut();
}

C'est ma méthode complète

public class SessionExpireFilterAttribute : ActionFilterAttribute
    {

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            HttpContext ctx = HttpContext.Current;

            // check if session is supported
            if (ctx.Session != null)
            {

                // check if a new session id was generated
                if (ctx.Session.IsNewSession)
                {

                    // If it says it is a new session, but an existing cookie exists, then it must
                    // have timed out
                    string sessionCookie = ctx.Request.Headers["Cookie"];
                    if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0))
                    {
                        string redirectOnSuccess = filterContext.HttpContext.Request.Url.PathAndQuery;
                        string redirectUrl = string.Format("?ReturnUrl={0}", redirectOnSuccess);
                        string loginUrl = FormsAuthentication.LoginUrl + redirectUrl;
                        if (ctx.Request.IsAuthenticated)
                        {
                            FormsAuthentication.SignOut();
                        }
                        RedirectResult rr = new RedirectResult(loginUrl);
                        filterContext.Result = rr;
                        //ctx.Response.Redirect("~/Home/Logon");

                    }
                }
            }

            base.OnActionExecuting(filterContext);
        }
    }
14
répondu Tom 2014-11-25 16:38:43