c# - sesion - Detectando caducidad de sesión en ASP.NET MVC
variables de session c# mvc 4 (2)
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");
}
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)?
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);
}
}