Wykrywanie wygaśnięcia sesji na ASP.NET MVC

Zbudowałem koszyk, który używa stanu sesji do przechowywania danych koszyka podczas przeglądania sklepu.

Mam problem, w którym jeśli pozostawiam okno przeglądarki otwarte przez długi czas na kroku 1 koszyka, a następnie naciśnij "Przejdź do kroku 2" , moje działania rzucają błąd, ponieważ akcja step2 zakłada, że sesja nie wygasła, a obiekt ShopCart jest w prawidłowym stanie.

Chciałbym, aby ten scenariusz był milszy dla moich użytkowników, ale myślę, że muszę jakoś wykryć, czy sesja wygasła, tak, że przy następnym żądaniu mogę rzucić je do Step1.

Znalazłem następujący kod, który twierdzi, że rozwiązuje problem, ale nie działa dla mnie.

Warunek IsNewSession jest prawdziwy, ale warunek

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

Zawsze zwraca false i nigdy nie obsługuje nieprawidłowej sesji. Jestem zdezorientowany.

Czy jest to możliwe w ASP.NET (i MVC)?

Author: Matt, 2009-09-29

2 answers

Sposób 1

Umieść ten kod w Init / Load Zdarzenie na stronie 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");
                }
            }
        }

Sposób 2

Alternatywa możesz sprawdzić, czy obiekt Session istnieje przed przystąpieniem do pracy z nim na stronie 2, Tak:

if (Session["Key"] != null)
{
   Object O1 = (Object) Session["Key"]; 
}
else
{
    Response.Redirect("ErrorPage.aspx");
}
 16
Author: The King,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-25 16:37:03

Odpowiedź Króla mi nie odpowiada. Dodałem FormsAuthentication.SignOut() w OnActionExcuting(). Response.Redirect nie zadziała!

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

To jest moja kompletna metoda

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
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-25 16:38:43