Dans ASP.NET, quand dois-je utiliser Session.Clear () plutôt que Session.Abandon ()?

118

Session.Clear () et Session.Abandon () se débarrassent des variables de session. Si je comprends bien, Abandon () met fin à la session en cours et provoque la création d'une nouvelle session, provoquant ainsi le déclenchement des événements End et Start.

Il semble préférable d'appeler Abandon () dans la plupart des cas, comme la déconnexion d'un utilisateur. Y a-t-il des scénarios dans lesquels j'utiliserais Clear () à la place? Y a-t-il une grande différence de performance?

Lance Fisher
la source

Réponses:

172

Session.Abandon() détruit la session et l' événement Session_OnEnd est déclenché.

Session.Clear()supprime simplement toutes les valeurs (contenu) de l'objet. La session avec la même clé est toujours active.

Donc, si vous utilisez Session.Abandon(), vous perdez cette session spécifique et l'utilisateur recevra une nouvelle clé de session. Vous pouvez l'utiliser par exemple lorsque l'utilisateur se déconnecte.

Utilisez Session.Clear(), si vous voulez que l'utilisateur reste dans la même session (si vous ne voulez pas que l'utilisateur se reconnecte par exemple) et réinitialise toutes les données spécifiques à la session.

splattne
la source
1
Je pense qu'il vaut mieux utiliser RemoveAll () au lieu de Clear (), comme "Darin Dimitrov" l'a suggéré ici stackoverflow.com/a/3931344/713246
Bibhu
4
@Bibhu: Comment a-t-il suggéré que RemoveAll () était meilleur que Clear ()? Tout ce que j'ai vu dans sa réponse, c'est que RemoveAll () appelle Clear () et semble être fonctionnellement identique.
Adam Miller
1
Juste utilisé Session.Abandon()comme `` déconnexion '' sur une application interne à l'aide de l'authentification Windows - les utilisateurs n'avaient pas à se réauthentifier (Chrome, FF), mais la session supprimée et une nouvelle émise, ce qui répondait à mes exigences
brichins
13

Utiliser uniquement Session.Clear () lorsqu'un utilisateur se déconnecte peut poser une faille de sécurité. Comme la session est toujours valide en ce qui concerne le serveur Web. Il est alors une question raisonnablement triviale de renifler, de saisir l'ID de session et de détourner cette session.

Pour cette raison, lors de la déconnexion d'un utilisateur, il serait plus sûr et plus judicieux d'utiliser Session.Abandon () pour que la session soit détruite et qu'une nouvelle session soit créée (même si la page d'interface utilisateur de déconnexion ferait partie de la nouvelle session, la nouvelle session ne contiendrait aucun des détails de l'utilisateur et le détournement de la nouvelle session équivaudrait à avoir une nouvelle session, donc elle serait muette).

shabbirh
la source
4
Quel serait l'intérêt de détourner une session vide? Le pirate de l'air devrait toujours se connecter, et il n'y a aucune donnée à fournir accidentellement au nouvel utilisateur.
Trisped le
3

Session.Abandondétruit la session comme indiqué ci-dessus, vous devez donc l'utiliser lors de la déconnexion de quelqu'un. Je pense qu'une bonne utilisation de Session.Clearserait pour un panier sur un site de commerce électronique. De cette façon, le panier est effacé sans déconnecter l'utilisateur.

Kasim Shafiq
la source
Mais que se passe-t-il si j'utilise Session.Abandonsimplement pour effacer un panier spécifique?
WTFZane
0

J'ai eu ce problème et j'ai essayé les deux, mais j'ai dû me contenter de supprimer des conneries comme "pageEditState", mais de ne pas supprimer les informations utilisateur de peur que je doive le rechercher à nouveau.

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