2009-02-03 17 views
9

Necesito una forma de decirle a ASP.NET "Elimine la sesión actual y comience nuevamente con una nueva" antes/después de un redireccionamiento a una página.Haga que la sesión expire correctamente en ASP.NET

Aquí es lo que estoy tratando de hacer:

1) detectar cuando caduca una sesión 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 utilizar la aplicación nuevamente.

Ok, hasta ahora tengo los pasos 1 y 2 cubiertos. 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í tiene que haber enfrentado este problema antes, por lo que confío en que la comunidad tenga una buena solución. Gracias por adelantado.

+0

no estoy seguro de por qué usted tiene un problema, ¿por qué SOULD la IsNewSession ser cierto cuando se solicita la página principal. Para entonces, ya ha recibido una solicitud para una página y luego una solicitud para la "Sesión expirada" y luego a la página principal. ¿Por qué IsNewSession seguiría siendo cierto? – AnthonyWJones

Respuesta

11

El problema que está describiendo sucede porque asp.net está reutilizando el sessionid, si el sessionid aún existe en la cookie de autenticación cuando llama a abandon() solo lo reutilizará, necesita crear explícitamente un nuevo sessionid afaik algo como:

HttpCookie mycookie = new HttpCookie("ASP.NET_SessionId"); 
    mycookie.Expires = DateTime.Now.AddDays(-1); 
    Response.Cookies.Add(mycookie); 
+0

gracias por la pronta respuesta, esto funcionó para mí. –

-1

son usted que llama Session.Abandon en su especial "su sesión ha finalizado" página? Si es así, no.

+2

urm .. explicación? –

0

El añadiendo el truco de galletas trabajó para mí 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 
2

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 pudieran accidentalmente volver a crear una sesión
  • vuelvo la hora actual y la ID de sesión para que pueda verificar la acción completada succcessfully

    public ActionResult ExpireSession() 
    { 
        string sessionId = Session.SessionID; 
        Session.Abandon(); 
        return new ContentResult() 
        { 
         Content = "Session '" + sessionId + "' abandoned at " + DateTime.Now 
        }; 
    } 
    
2

El código en su página principal, que detecta una sesión caducada y redirige, debe ser similar esto:

if (Session != null 
    && Session.IsNewSession 
    && Request.Cookies["ASP.NET_SessionId"] != null 
    && Request.Cookies["ASP.NET_SessionId"].Value != "") 
{ 
    Session.Clear(); 
    Response.Redirect(timeoutPageUrl); 
} 

Calling Session.clear() antes de redirigir asegura que en la página posterior, Session.IsNewSession será falsa.

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 que expire el viejo cookie de sesión como parte del proceso de cierre de sesión:

Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.MinValue; 
+0

Session.Clear() es la piedra angular! – Caesar

Cuestiones relacionadas