Cerrar sesión en ASP.NET (HTTPSessionState)

Ayer nos topamos en el trabajo con este detalle, y aunque al principio batallamos para encontrar solución, en realidad es algo sencillo.

ASP.NET utiliza un objeto HttpSessionState para permitirnos guardar variables en una sesión, es decir, mientras el usuario está en nuestro sitio Web sin cerrar el navegador.

public void Login(string usuario, string password)
{
    if (UsuarioValido(usuario, password))
    {
        Session["usuario"] = usuario;
    }
}

El objeto Session se inicializa con un identificador único para el sistema, y puede guardar tantas variables como se requieran. El problema es cuando queremos cerrar la sesión. Limpiar las variables no es tanto problema, pero cerrar una sesión significa inicializar el objeto Session por completo.

Para cerrar la sesión correctamente, debemos hacer esto:

public void Logout()
{
    Session.Abandon();
    Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
}

HttpSessionState tiene un método Clear() que borra todas las variables de la sesión. El método Abandon() cierra la sesión actual, lo cual hará que la próxima vez que se requiera una sesión, se inicialice automáticamente. No estamos usando el método Clear porque Abandon se encarga de limpiar la sesión.

La segunda línea de código la estamos usando para forzar el inicio de una nueva sesión, justo después de haber cerrado la anterior. El framework utiliza una cookie llamada ASP.NET_SessionId, en la que guarda la sesión actual, por lo que tenemos que sobreescribirla, utilizando el objeto Response para guardar la nueva. Con esto se regenera la sesión, con un nuevo identificador y sin variables. Lista para usarse desde cero.

12 comentarios sobre “Cerrar sesión en ASP.NET (HTTPSessionState)

    1. En cada página debes tener las validaciones para evitar que acceda un usuario no autorizado. En el evento Init o Load de todas las páginas, agrega la validación para que saque a los usuarios anónimos (que los envíe a la página de inicio, a la de login, o a donde sea).
      Si alguien le da para atrás, es muy probable que sí le muestre la página, pues el navegador utilizará su caché (archivos temporales) en lugar de cargar de nuevo desde el servidor. Pero es precisamente eso, archivos temporales guardados en caché. Al intenar ejecutar cualquier acción, la misma aplicación validará que sea un usuario en sesión, lo cual, como dije, debe ir en uno de los eventos de carga de la página.

  1. Como se puede programar, aun no he encotrador la solución, cuando un usuario cierra el navegador, la sesion se destruya.?

  2. buena informacion pero usar cookies como que algo ya viejo con el puro uso de session[] o application[] se puede hacer buen trabajo y con Session.Abandon() se ejecuta el metodo Session_End en global.asax siempre que timeout del webconfig se cumpla

    pero muy buena info

    saludos

    1. Usad lo siguiente:
      System.Web.Security.FormsAuthentication.SignOut()
      Session.Abandon()
      Response.Redirect(«default.aspx»)

      Listo.
      ¥ Bitxo

      1. Tengo un problema parecido, entro a ami aplicacion por la pagina L, mediante un link voy a la pagina A, intento poner la direccion de una pagina B en la barra de direcciones, como esta pagina verifica los privilegios del usuario me bota a la pagina L mediante un código como el mostrado de Sesion Abandon y Redirect, una vez en la pagina L «escribo en la barra de direcciones» la direccion de la Pag A y entra sin problemas y sin login, cabe mencionar que en todas las pgs de mi aplicacion está validada la sesion y el privilegio del usuario, puse un breack ponit en el «load» de la pg A y al princpio pasa por ahí pero en el 2º intento segun el orden que explique nisiquiera pasa por el Load y carga directamente la pg A mencinoada, alguna idea??

Replica a Victor Vidal Cancelar la respuesta