web-dev-qa-db-fra.com

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

J'ai construit un panier d'achat qui utilise l'état de session pour conserver les données du panier d'achat pendant que l'utilisateur parcourt le magasin.

J'ai un problème où si je laisse la fenêtre du navigateur ouverte pendant longtemps à l'étape 1 du panier, puis j'appuie sur "aller à l'étape 2", mes actions génèrent une erreur car l'action de l'étape 2 suppose que la session n'a pas expiré et que L'objet ShopCart est dans le bon état.

Je voudrais que ce scénario soit plus agréable pour mes utilisateurs, mais je pense que je dois en quelque sorte détecter si la session a expiré afin que, à la prochaine demande, je puisse les lancer à l'étape 1.

J'ai trouvé le code suivant qui prétend résoudre le problème, mais cela 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
}

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

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

25
CVertex

Voie 1

Mettez ce code dans l'événement Init/Load 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

Alternativement, vous pouvez vérifier si l'objet Session existe avant de continuer à travailler avec lui dans la page 2, comme ceci:

if (Session["Key"] != null)
{
   Object O1 = (Object) Session["Key"]; 
}
else
{
    Response.Redirect("ErrorPage.aspx");
}
18
The King

La réponse du roi ne fonctionne pas pour moi. J'ai ajouté FormsAuthentication.SignOut() dans OnActionExcuting(). Le Response.Redirect ne fonctionnera pas!

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

Ceci 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);
        }
    }
15
Tom

Vous devez créer la méthode Session_OnEnd dans le fichier Global.asax.cs dans votre projet.

c'est mon code et je suis en mesure de détecter l'expiration de la session sur ASP.NET MVC

protected void Session_OnEnd(object sender, EventArgs e)
{
    int userid = 0;
    userid = Convert.ToInt32(Session["UserID"]);
    if (userid != 0)
    {
        var userActivity = DependencyResolver.Current.GetService<IUserRepo>();
        var responce = userActivity.LogOutUsers(userid);
        if (responce == true)
        {
            Session.Clear();
            Session.Abandon();
        }
    }
}

plus

0
Sandip Kalsariya