Je suis surpris de ne pas avoir pu trouver de réponses.
Comment définir mon identifiant de session dans mon cookie pour qu'il expire à la fin de la session? (lorsque le navigateur se ferme ou que l'utilisateur est inactif depuis un certain temps).
Les deux solutions que j'ai trouvées étaient
(httpcookie).Expires = HttpContext.Current.Session.Timeout
Ce qui m'a donné une erreur de compilation, donc je ne sais pas si l'utilisateur a vérifié son code avant de poster. Et l'autre consistait à fixer la date d'expiration à 1 jour, ce que mon instinct dit est faux. Comment puis-je faire cela?
Vous parlez d'un cookie non persistant. Par défaut, asp.net envoie des cookies de cette manière. La principale différence entre eux est qu'un cookie persistant a une valeur d'expiration définie.
Donc, si vous ne voulez pas que le cookie persiste, ne définissez pas la valeur d'expiration.
Cela dit, le cookie restera en mémoire jusqu'à la fermeture du navigateur. Supposons qu'ils naviguent sur votre site et que vous définissiez un cookie non persistant. Ils font des choses et naviguent. Plus tard, ils reviennent sur votre site en utilisant la même instance de navigateur. Le cookie sera toujours là.
Maintenant, s'ils fermaient le navigateur à tout moment, le cookie serait supprimé.
Le point est, ne définissez pas l'en-tête expire. Surtout pas à la date d'expiration de la session. Les dates de session ne sont généralement que de 20 minutes environ à l'avenir, mais la date d'expiration est reportée lorsque l'utilisateur navigue sur votre site.
===== mise à jour =====
J'ai utilisé le code suivant pour les tests:
protected void Page_Load(object sender, EventArgs e) {
if (!Page.IsPostBack) {
HttpCookie c = Request.Cookies["test"];
if (c != null) {
Response.Write(String.Format("test value is {0} <br />", c.Value));
}
} else {
HttpCookie c = new HttpCookie("test");
c.Value = "HERE IT IS";
Response.Cookies.Add(c);
}
}
protected void Button1_Click(object sender, EventArgs e) {
Response.Write("clicked<br />");
}
le fichier .aspx simple avait un bouton qui déclenchait ce gestionnaire button1_click. Lorsque j'y accède initialement à l'aide de l'un des navigateurs les plus récents (par exemple, Firefox, Chrome), il n'y a pas de cookie. Après avoir cliqué sur le bouton, un cookie est défini. J'ai ensuite fermé complètement le navigateur, rouvert et revu le site. Dans tous les cas, le cookie a disparu.
Il est important de noter que ces jours-ci, vous ne pouvez pas compter sur la suppression d'un cookie de session lorsque l'utilisateur ferme le navigateur. Les deux Chrome et Firefox ont fait ce changement en 2012 environ) - voir les différents liens sur cette réponse .
Maintenant, ne pas supprimer les cookies de session me semble être un trou de sécurité terrible, horrible, pas bon, très mauvais, sans parler d'une violation de tous les RFC pertinents, mais apparemment nos Overlords Google (et Mozilla) savent mieux.
Je ne sais pas quelle est la meilleure solution de contournement, mais l'approche que je prends est de réinitialiser la propriété "Expires" sur le cookie à une heure dans le futur après chaque appel. Ce n'est pas précisément le comportement souhaité, mais je pense que c'est mieux que de permettre aux cookies cruciaux de rester pour toujours.
Ouvert à d'autres suggestions ou clarifications.
TimeOut
renvoie un int
, Expires
attend DateTime
, c'est pourquoi ce code ne sera pas compilé. Fixer la date d'expiration à ce jour dans le passé révoque immédiatement le cookie, ce n'est donc probablement pas ce que vous voulez. Si vous laissez la date d'expiration inutilisée, le cookie expirera dès que l'utilisateur fermera le navigateur.
Si vous voulez que le cookie soit lié à la session particulière, pourquoi impliquer le cookie en premier lieu? Vous pouvez certainement continuer à prolonger la date d'expiration du cookie à chaque fois que l'utilisateur prolonge la session en utilisant votre application, mais cela semble être un travail inutile. Utilisez simplement Session.
N'hésitez pas à développer le problème.
N'utilisez PAS le contrôle de connexion, cela rend la tâche plus difficile.
protected void btnLogin_Click(object sender, EventArgs e)
{
// Check user and password in database
bool isValidUser = ValidateUser(txtUsername.Text, txtPassword.Text);
// Set cookie to be not persistent - this means if the user closes the browser,
//autentification cookie will be deleted and the user is not longer logged
bool isPersistentCookie = false;
// Login user with the new username
FormsAuthentication.SetAuthCookie(txtUsername.Text, isPersistentCookie);
}