2016-10-10 1 views
1

Je tente de modifier un site Web MVC stockant des informations dans Session pour le stocker dans un cookie, mais j'ai des problèmes avec l'expiration du cookie.Persistance de cookie: impossible de définir la date d'expiration

Scénario lors de la connexion au site, un cookie est créé et ajouté à la collection actuelle cookies de réponse HttpContext. Le morceau de code utilisé pour écrire le cookie est la suivante:

HttpCookie userCredsCookie = _context.Response.Cookies.Get(Constants.Web.UserCredentialsCookieName) ?? new HttpCookie(Constants.Web.UserCredentialsCookieName); 
       userCredsCookie.HttpOnly = true; 
       userCredsCookie.Secure = true; 
       userCredsCookie.Value = user.ID.ToString(); 
       userCredsCookie.Expires = DateTime.Now.AddMinutes(user.CompanySessionTimeout + user.TimezoneOffset);     
       _context.Response.Cookies.Add(userCredsCookie); 

J'ai expérimenté avec la suppression de la ligne qui définit l'expiration du cookie et ont trouvé que le cookie est généré et stocké au niveau du client comme prévu.

Quand j'inspecte la réponse du serveur à l'aide Fiddler je peux voir que le cookie de userCreds est de retour:

Response sent 111 bytes of Cookie data: 
    Set-Cookie: UserCreds=e2ce8200-fb38-45b9-8aec-4d93e6640a84; expires=Mon, 09-Oct-2017 16:20:43 GMT; path=/; secure; HttpOnly 

lorsque l'expiration est fixé non la réponse a:

Response sent 72 bytes of Cookie data: 
Set-Cookie: UserCreds=e2ce8200-fb38-45b9-8aec-4d93e6640a84; path=/; secure; HttpOnly 

Comme Tant que l'expiration n'est pas définie, le cookie est accepté par le navigateur et envoyé aux demandes ultérieures faites à partir du navigateur.

On dirait que le problème est dû au format de la date dans la réponse mais je ne trouve rien pour me permettre de changer ce format.

Toute aide serait grandement apprécié.

Cordialement Monty

Mise à jour - Cause possible situé

J'ai trouvé que le problème que j'ai est de faire avec le calendrier. Il semble que mon pc de développement puisse traiter les réponses de l'appel ajax qui met le cookie trop vite (??? est-ce possible?). Pendant que je déboguais le code frontal pour que les choses se passent bien de cette perspective, j'ai trouvé cela en plaçant un point d'arrêt juste avant la ligne qui plaçait la fenêtre window.location à une URL qui est dans le résultat de l'ajax appel, l'appel suivant a été fait avec le cookie étant sur la demande. Peut-être, en provoquant la pause du traitement du rappel, a donné au système le temps de persister le cookie. Je suppose que le processus de persistance d'un cookie consiste à effectuer une vérification de validation puis à stocker les données. Cela voudrait dire que cela prend un peu plus de temps pour valider le cookie lorsqu'il s'agit d'une date d'expiration. Peut-être que la raison pour laquelle un cookie sans délai d'expiration persistait mais que ceux avec une expiration ne l'était pas parce que le chargement d'une nouvelle URL interrompait le processus, empêchant ainsi le cookie d'être stocké. En ajoutant un délai de 1 milliseconde (oui, seulement 1 milliseconde) dans le gestionnaire de succès de l'appel ajax, j'ai réussi à faire en sorte que le cookie persiste dans le navigateur et soit inclus dans l'appel fait pour charger une URL de retour dans la réponse ajax.

Est-ce son possible?

+0

quelle est la valeur de user.CompanySessionTimeout et user.TimezoneOffset? –

+0

dans le cas où j'ai travaillé avec l'utilisateur. CompanySessionTimeout est défini sur 1 an (en minutes bien sûr) et user.TimezoneOffset sur 660 mins Cependant, il a été testé avec user.CompanySessionTimeout défini sur 10 min précédemment –

Répondre

0

essayer avec ce code

int result = Convert.ToInt32(user.CompanySessionTimeout.ToString()) + Convert.ToInt32(user.TimezoneOffset) 

puis passer

userCredsCookie.Expires = DateTime.Now.AddMinutes(result); 
+0

Je vais essayer, mais je ne vois pas comment cela aura un effet différent ... Je sais que l'expiration est définie dans le cookie mais quand elle est définie, le cookie ne persiste pas. –

+0

Merci pour le conseil LateshtClick.com mais comme je m'attendais il n'y avait aucun changement au comportement avec ce changement de code ... J'ai également changé le code pour utiliser Cookies.Set plutôt que Cookies.Add (comme je l'ai vu dans autres questions réponses) et il n'a pas affecté le comportement non plus. –