Question

Je crée un httpcookie, définir uniquement le nom et la valeur et non la propriété expire, puis l'ajoutez à la réponse. Assez simple. Le cookie est créé (mais non persisté) comme prévu. Le problème est que la session change pour une raison quelconque (comme le site Web a été reconstruite, ou j'ai reconstruit mon application lors du débogage) alors le cookie reste autour. Je veux que le cookie soit valide pour seulement la session d'origine qu'elle a été créée.

Selon MSDN, il dit: "Si vous ne spécifiez pas de limite d'expiration pour le cookie, le cookie n'est pas persisté à l'ordinateur client et expire lorsque la session d'utilisateur expire."

Je suppose que je ne sais pas exactement quelle "session expire" englobe. Je pense que le cookie est supprimé après 20 minutes lorsque la session expire. Mais le cookie devrait-il être supprimé si la session qu'il a été créée n'existe plus pour un nombre quelconque de raisons? La seule fois où j'ai vu le cookie est supprimé, c'est lorsque l'utilisateur ferme toutes les fenêtres du navigateur et ouvre une nouvelle.

Si tout est vrai, je devrais peut-être stocker l'ID de session d'origine ("ASP.NET_SESSIONIDE") dans le cookie, puis vérifiez-le contre l'ID de session en cours, s'ils sont différents, puis supprimez le cookie ou créez. un nouveau.

Voici le code (la seule différence entre mon cookie et celui dans les exemples MSDN est que je stocke plusieurs valeurs dans le cookie):

private void SaveValuesToCookie(string[] names, string[] values)
{
    HttpCookie cookie = new HttpCookie("MyCookie");

    for (int i = 0; i < names.Length; i++)
    {
        string name = names[i];
        cookie.Values[name] = values[i];
    }
    Response.Cookies.Add(cookie);
}

private string GetValueFromCookie(string name)
{
    HttpCookie cookie = Request.Cookies["MyCookie"];
    if (cookie == null)
        return null;

    return cookie.Values[name];
}

Était-ce utile?

La solution

la seule fois où j'ai vu le cookie obtenir supprimé est lorsque l'utilisateur ferme tout Windows du navigateur et ouvre un nouveau.

Et c'est exactement ce que MSDN signifie quand il est dit que le cookie sera supprimé lorsque la session expire. Malheureusement, je pense que cela n'est pas consistant à travers les navigateurs de toute façon, il n'y a donc pas grand chose à personne.

Vous devez toujours définir une date d'expiration sur les cookies.

Si c'est tout vrai, je pourrais avoir à Stocker l'ID de session d'origine ("Asp.net_sessionid") dans le cookie, puis vérifiez-le contre le courant ID de session, s'ils sont différents, alors Supprimez le cookie ou créez un nouveau.

Je déteste le dire, mais cela ne va pas vous aider non plus. Le .NET Framework aime recycler les identifiants de session, vous ne pouvez donc pas garantir que ce sera différent.

Mauvaise nouvelle de la route, je vous conseillerais de reconsidérer ce que vous essayez de faire d'un point de vue architectural.

Redémarrer l'application est quelque chose qui se produit entièrement sur le serveur; Les cookies sont quelque chose qui se passe entièrement sur le client. Bien que le client parle au serveur, c'est purement une relation de demande / réponse, le serveur ne peut pas communiquer d'événements tels qu'un redémarrage de l'application sur le navigateur.

Si vous souhaitez stocker une valeur quelque part qui n'est valable que pour la durée de vie d'une session de serveur, pourquoi ne pas la stocker en session plutôt que dans un cookie?

Autres conseils

Je suis au courant de tout cela, mais il n'est pas assez sécurisé pour les besoins de nos clients.La session peut toujours être spoofed ou injectée.Voir: http://msdn.microsoft.com/en-us/Magazine / CC163730.ASPX # S9

On dirait que je suis resté à la création d'un cookie sécurisé expiré séparé de la session et de rafraîchir la date d'expiration lorsque je peux (c'est-à-dire lorsque l'utilisateur accède à certaines pages).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top