Haz que la sesión expire correctamente en ASP.NET
session redirect (5)
Necesito una forma de decirle a ASP.NET "Mate la sesión actual y vuelva a empezar con una nueva" antes / después de un redireccionamiento a una página.
Esto es lo que trato de hacer:
1) Detecta cuando una sesión ha expirado en la página maestra (o Global.asax) de una aplicación ASP.NET.
2) Si la sesión ha expirado, redirija al usuario a una página indicándole que su sesión ha expirado. En esta página, esperará 5 segundos y luego redirigirá al usuario a la página principal de la aplicación o, alternativamente, puede hacer clic en un enlace para llegar antes si lo desea.
3) El usuario llega a la página principal y comienza a usar la aplicación nuevamente.
Ok, hasta ahora tengo cubiertos los pasos 1 y 2. Tengo una función que detecta la caducidad de la sesión utilizando la propiedad IsNewSession y el valor de la cookie de ID de sesión ASP.NET. si detecta una sesión caducada, redirige, espera cinco segundos y luego INTENTA ir a la página principal.
El problema es que cuando intenta redireccionar, llega a la parte de la página maestra para detectar una sesión caducada y devuelve verdadero. Intenté llamar a Session.Abandon (), Session.Clear (), incluso estableciendo la sesión en NULL, sin suerte.
Alguien por ahí ha tenido que enfrentar este problema antes, así que confío en que la comunidad tendrá una buena solución. Gracias por adelantado.
¿Estás llamando Session.Abandon en tu página especial "Your session expired"? Si es así, no.
El problema que estás describiendo sucede porque asp.net está reutilizando el sessionid, si el sessionid aún existe en la cookie de autenticación cuando llamas a abandon () solo lo reutilizará, necesitas crear explícitamente un nuevo sessionid afaik algo así como:
HttpCookie mycookie = new HttpCookie("ASP.NET_SessionId");
mycookie.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(mycookie);
La adición del truco de las cookies me funcionó también, de la siguiente manera:
Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
'' Code that runs when a new session is started
If Session.IsNewSession Then
''If Not IsNothing(Request.Headers("Cookie")) And Request.Headers("Cookie").IndexOf("ASP.NET_SessionId") >= 0 Then
If Not IsNothing(Request.Headers("Cookie")) AndAlso Request.Headers("Cookie").IndexOf("ASP.NET_SessionId") >= 0 Then
''VB code
Dim MyCookie As HttpCookie = New HttpCookie("ASP.NET_SessionId")
MyCookie.Expires = System.DateTime.Now.AddDays(-1)
Response.Cookies.Add(MyCookie)
''C# code
''HttpCookie mycookie = new HttpCookie("ASP.NET_SessionId");
''mycookie.Expires = DateTime.Now.AddDays(-1);
''Response.Cookies.Add(mycookie);
Response.Redirect("/timeout.aspx")
End If
End If
End Sub
Para ASP.NET MVC esto es lo que estoy haciendo con un método de acción.
Nota:
- Devuelve una vista simple sin otros recursos que podrían recrear accidentalmente una sesión
Devuelvo la hora actual y la identificación de la sesión para que pueda verificar la acción completada con éxito
public ActionResult ExpireSession() { string sessionId = Session.SessionID; Session.Abandon(); return new ContentResult() { Content = "Session ''" + sessionId + "'' abandoned at " + DateTime.Now }; }
El código en su página maestra, que detecta una sesión expirada y redirecciones, debería verse así:
if (Session != null
&& Session.IsNewSession
&& Request.Cookies["ASP.NET_SessionId"] != null
&& Request.Cookies["ASP.NET_SessionId"].Value != "")
{
Session.Clear();
Response.Redirect(timeoutPageUrl);
}
La sesión de llamada. Borrar () antes de redirigir garantiza que en la página siguiente, Session.IsNewSession será falso.
También tenga en cuenta que estoy buscando una cadena vacía en el valor de la cookie ASP.NET_SessionId. Esto ayuda a evitar que una salida de sesión se confunda como una sesión caducada, si llama a Session.Abandon () en su proceso de cierre de sesión. En ese caso, asegúrese de caducar la cookie de sesión anterior como parte del proceso de cierre de sesión:
Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.MinValue;