web-dev-qa-db-fra.com

Cookie expirant à la fin de la session du navigateur

Ma recherche indique que, si je crée un cookie sans définir la date d'expiration, celui-ci expirera à la fermeture du navigateur.

J'ai donc créé un cookie comme ceci:

Response.Cookies.Set(new HttpCookie("MyKey", "X"));

Mais lorsque je ferme le navigateur, puis le rouvre, l'expression suivante est égale à true:

Request.Cookies["MyKey"] != null

Comment puis-je faire expirer le cookie à la fin de la session du navigateur?

Remarque: À mes fins, utiliser des données statiques au lieu d'un cookie semble idéal. Mais si j'ai bien compris, un ASP.NET peut redémarrer pour diverses raisons. Cela risquerait d'empêcher l'utilisateur actuel de perdre le contrôle si je perdais ce paramètre.

13
Jonathan Wood

Il semble que le problème est tel que décrit par Stober. Vous pouvez définir un cookie pour qu'il expire à la fin de la session du navigateur en définissant la propriété HttpCookie.Expires sur DateTime.MinDate ou en ne définissant pas la propriété du tout.

Cependant, au moins avec la commande Récupérer de Chrome où vous avez laissé settings, il semble que la session du navigateur ne se termine pas nécessairement à la fermeture du navigateur. Lorsqu'il est fermé puis rouvert, le navigateur Chrome reprend les opérations là où il s'était arrêté, comme si la session ne s'était jamais terminée. Cela inclut la poursuite de l’utilisation des cookies dont l’expiration expire à la fin de la session.

J'ai essayé le même code sur FireFox. La fermeture et la réouverture du navigateur ont entraîné l'expiration du cookie, exactement comme prévu.

Ainsi, bien qu'il existe des règles générales, ce comportement incombe totalement au navigateur.

16
Jonathan Wood

Vous pouvez intercepter ceci lors du prochain événement Session_start. Si vous avez déjà un utilisateur authentifié immédiatement au démarrage d'une toute nouvelle session, vous devez avoir obtenu ces informations d'un cookie périmé. Supprimez les informations sur l'utilisateur et laissez les redirections de connexion se charger du reste. 

Quelque chose comme ça dansglobal.asax.cs:

protected void Session_start()
{
    // starting a session and already authenticated means we have an old cookie
    var existingUser = System.Web.HttpContext.Current.User;
    if (existingUser != null && existingUser.Identity.Name != "")
    {
        // clear any existing cookies
        IAuthenticationManager authMgr = System.Web.HttpContext.Current.GetOwinContext().Authentication;
        authMgr.SignOut("MyCookieType")

        // manually clear user from HttpContext so Authorize attr works
        System.Web.HttpContext.Current.User = new ClaimsPrincipal(new ClaimsIdentity());
    }

}
  • Le code peut varier quelque peu en fonction de l'authentification des utilisateurs.

Voir également:

1
KyleMit

Définissez simplement la propriété Expires de votre instance HttpCookie sur DateTime.MinDate et elle expirera à la fin de la session du navigateur. 

Cependant , il s’agit en fait de ce n’est pas un moyen sûr de protéger quelque chose avec des cookies, car les cookies sont en fait valables à vie. Cela dépend de la mise en œuvre du client si les cookies sont jetés ou non. Si une mauvaise personne intercepte vos cookies, elle y aura accès pour toujours.

Voir aussi: MSDN - Cookie.Expires Property

0
Kees de Wit