Detectando caducidad de sesión en ASP.NET MVC

Creé un carrito de compras que usa el estado de sesión para mantener los datos del carrito de compras mientras el usuario está navegando por la tienda.

Tengo un problema por el cual si dejo la ventana del navegador abierta durante mucho tiempo en el paso 1 del carrito de compras, y luego presiono “ir al paso 2”, mis acciones arrojan un error porque la acción step2 supone que la sesión no ha expirado y el El objeto ShopCart está en el estado correcto.

Me gustaría que este escenario fuera más agradable para mis usuarios, pero creo que necesito detectar de alguna manera si la sesión ha expirado para que en la próxima solicitud pueda enviarlos al Paso 1.

Encontré el siguiente código que pretende resolver el problema, pero no funciona para mí.

La condición IsNewSession es verdadera pero la condición

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

siempre devuelve falso y nunca maneja la sesión no válida. Estoy confundido.

¿Es esto posible en ASP.NET (y MVC)?

Camino 1

Coloque este código en el evento Init / Load de la página 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"); } } } 

Camino 2

Alternativa puede verificar si el objeto Session existe antes de proceder a trabajar con él en la página 2, así:

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

La respuesta del Rey no funciona para mí. He agregado FormsAuthentication.SignOut() en OnActionExcuting() . ¡ Response.Redirect no funcionará!

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

Este es mi método completo

 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); } }