No ASP.NET, quando devo usar Session.Clear () em vez de Session.Abandon ()?

118

Tanto Session.Clear () quanto Session.Abandon () eliminam as variáveis ​​de sessão. Pelo que entendi, Abandon () encerra a sessão atual e faz com que uma nova sessão seja criada, fazendo com que os eventos End e Start sejam disparados.

Parece preferível chamar Abandon () na maioria dos casos, como desconectar o usuário. Existem cenários onde eu usaria Clear () em vez disso? Existe muita diferença de desempenho?

Lance Fisher
fonte

Respostas:

172

Session.Abandon() destrói a sessão e o evento Session_OnEnd é acionado.

Session.Clear()apenas remove todos os valores (conteúdo) do objeto. A sessão com a mesma chave ainda está viva.

Portanto, se você usar Session.Abandon(), perderá aquela sessão específica e o usuário obterá uma nova chave de sessão. Você pode usá-lo, por exemplo, quando o usuário efetua logout.

Use Session.Clear(), se quiser que o usuário permaneça na mesma sessão (se não quiser que o usuário faça login novamente, por exemplo) e redefina todos os dados específicos da sessão.

splattne
fonte
1
Acho melhor usar RemoveAll () em vez de Clear (), como "Darin Dimitrov" sugeriu aqui stackoverflow.com/a/3931344/713246
Bibhu
4
@Bibhu: Como ele sugeriu que RemoveAll () era melhor do que Clear ()? Tudo o que vi em sua resposta foi que RemoveAll () chama Clear () e parece ser funcionalmente idêntico.
Adam Miller,
1
Usado apenas Session.Abandon()como um 'logout' em um aplicativo interno usando a Autenticação do Windows - os usuários não precisaram se autenticar novamente (Chrome, FF), mas a sessão foi descartada e uma nova foi emitida, que atendeu aos meus requisitos
brichins
13

Somente usar Session.Clear () quando um usuário efetua logout pode representar uma falha de segurança. Como a sessão ainda é válida no que diz respeito ao Servidor Web. Então, é uma questão razoavelmente trivial farejar e capturar o Id da sessão e sequestrar essa sessão.

Por este motivo, ao desconectar um usuário, seria mais seguro e mais sensato usar Session.Abandon () para que a sessão seja destruída e uma nova sessão criada (mesmo que a página de interface de usuário de logout faça parte da nova sessão, a nova sessão não teria nenhum dos detalhes do usuário nela e sequestrar a nova sessão seria equivalente a ter uma nova sessão, portanto, ficaria sem som).

shabbirh
fonte
4
Qual seria o objetivo de sequestrar uma sessão vazia? O sequestrador ainda teria que fazer login e não há dados para fornecer acidentalmente ao novo usuário.
Trisped em
3

Session.Abandondestrói a sessão conforme declarado acima, portanto, você deve usar isso ao desconectar alguém. Acho que um bom uso de Session.Clearseria para uma cesta de compras em um site de comércio eletrônico. Dessa forma, a cesta é limpa sem desconectar o usuário.

Kasim Shafiq
fonte
Mas e se eu usar Session.Abandonapenas para limpar uma cesta de compras específica?
WTFZane de
0

Eu tive esse problema e tentei os dois, mas tive que me contentar em remover porcarias como "pageEditState", mas não remover as informações do usuário para não ter que pesquisar novamente.

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