En ASP.NET, ¿cuándo debería usar Session.Clear () en lugar de Session.Abandon ()?

118

Tanto Session.Clear () como Session.Abandon () eliminan las variables de sesión. Según tengo entendido, Abandon () finaliza la sesión actual y hace que se cree una nueva sesión, lo que provoca que se activen los eventos End e Start.

Parece preferible llamar a Abandon () en la mayoría de los casos, como cerrar la sesión de un usuario. ¿Hay escenarios en los que usaría Clear () en su lugar? ¿Hay mucha diferencia de rendimiento?

Lance Fisher
fuente

Respuestas:

172

Session.Abandon() destruye la sesión y se activa el evento Session_OnEnd .

Session.Clear()simplemente elimina todos los valores (contenido) del Objeto. La sesión con la misma clave sigue viva.

Entonces, si usa Session.Abandon(), pierde esa sesión específica y el usuario obtendrá una nueva clave de sesión. Puede usarlo, por ejemplo, cuando el usuario cierra la sesión.

Use Session.Clear(), si desea que el usuario permanezca en la misma sesión (si no desea que el usuario vuelva a iniciar sesión, por ejemplo) y restablezca todos los datos específicos de la sesión.

splattne
fuente
1
Creo que es mejor usar RemoveAll () en lugar de Clear (), como sugirió "Darin Dimitrov" aquí stackoverflow.com/a/3931344/713246
Bibhu
4
@Bibhu: ¿Cómo sugirió que RemoveAll () era mejor que Clear ()? Todo lo que vi en su respuesta fue que RemoveAll () llama a Clear () y parece ser funcionalmente idéntico.
Adam Miller
1
Solo se usó Session.Abandon()como un 'cierre de sesión' en una aplicación interna usando la autenticación de Windows: los usuarios no tuvieron que volver a autenticarse (Chrome, FF), pero la sesión se eliminó y se emitió una nueva, que cumplió con mis requisitos
brichins
13

Solo usar Session.Clear () cuando un usuario cierra sesión puede suponer un agujero de seguridad. Ya que la sesión sigue siendo válida en lo que respecta al servidor web. Entonces, es un asunto razonablemente trivial oler, tomar la identificación de la sesión y secuestrar esa sesión.

Por esta razón, al cerrar la sesión de un usuario, sería más seguro y sensato usar Session.Abandon () para que la sesión se destruya y se cree una nueva sesión (aunque la página de la IU de cierre de sesión formaría parte de la nueva sesión, la nueva sesión no tendría ninguno de los detalles de los usuarios y secuestrar la nueva sesión sería equivalente a tener una nueva sesión, por lo tanto, sería muda).

Shabbirh
fuente
4
¿Cuál sería el punto de secuestrar una sesión vacía? El secuestrador aún tendría que iniciar sesión y no hay datos para proporcionar accidentalmente al nuevo usuario.
Trisped
3

Session.Abandondestruye la sesión como se indicó anteriormente, por lo que debe usar esto cuando cierre la sesión de alguien. Creo que un buen uso de Session.Clearsería para una cesta de la compra en un sitio web de comercio electrónico. De esa manera, la canasta se borra sin cerrar la sesión del usuario.

Kasim Shafiq
fuente
Pero, ¿y si utilizo Session.Abandonpara borrar una cesta de la compra específica?
WTFZane
0

Tuve este problema y probé ambos, pero tuve que conformarme con eliminar basura como "pageEditState", pero no eliminar la información del usuario para no tener que buscarla nuevamente.

public static void RemoveEverythingButUserInfo()
{
    foreach (String o in HttpContext.Current.Session.Keys)
    {
        if (o != "UserInfoIDontWantToAskForAgain")
            keys.Add(o);
    }
}
MatthewMartin
fuente