2011-05-23 14 views
6

En mi aplicación web ASP.NET llamo al Session.Abandon() en Page_Load(). Esperaría que esto abandone la sesión de inmediato y la próxima vez que haga referencia al HttpContext.Current.Session, se debe crear una nueva sesión. Sin embargo, poner puntos de corte en los controladores Session_End y Session_Start en Global.asax indica que no se invocan hasta que la página haya finalizado la representación.Session.Abandon() no abandona la sesión inmediatamente

Dos preguntas:

1) ¿Por qué?

2) ¿Cómo puedo seguir usando HttpContext.Current.Session dentro de un ciclo de vida de página una vez que se ha llamado a Session.Abandon()?

¡Gracias de antemano!

Respuesta

10

http://msdn.microsoft.com/en-us/library/ms524310(v=vs.90).aspx

Mira la sección de comentarios en la página enlazada. Parece que los objetos de la sesión solo se ponen en cola para su eliminación, y no se eliminan hasta que el código termina de ejecutarse.

+0

Gracias Elad. Por lo tanto, parece que la respuesta a mi segunda pregunta es que no es una buena idea continuar usando el objeto de sesión en el ciclo de vida de la página actual una vez que se ha llamado a Session.Abandon() ya que no se perderá una vez que la página ha prestado –

+0

Creo que estará disponible en la página actual, pero no en páginas posteriores y/o si la página se actualiza/pasa por otra devolución. En cualquier caso, si llama a session.abandon, logid dicta que ya no tiene más uso :) –

2

Session.Abandon() realmente espera hasta que la página se haya procesado.

4

Esta fue mi solución:

private void PurgeSession() 
{ 
    try 
    { 
     Session.Clear(); 
    } 
    catch (Exception) { } 

    try 
    { 
     Session.Abandon(); 
    } 
    catch (Exception) { } 

    try 
    { 
     Session.RemoveAll(); 
    } 
    catch (Exception) { } 

    try 
    { 
     Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId") 
           {Expires = DateTime.Now.AddYears(-1)}); 
    } 
    catch (Exception) { } 
} 

Esto es efectivamente la opción bombardeo orbital.

Alguna información proveniente de: http://www.dotnetfunda.com/articles/article1395-how-to-avoid-the-session-fixation-vulnerability-in-aspnet-.aspx

+0

También entiendo que hay alguna forma de obtener "ASP.NET_SessionId" del web.config para admitir si las personas cambiaron su sesión nombre de la cookie, pero no me preocupé por sacarlo ya que uso los nombres predeterminados. –

Cuestiones relacionadas