Question

J'ai créé un FormsAuthenticationTicket à partir de zéro, mais a constaté que lors de la récupération à un moment plus tard, le UserData ne reviendra pas. Voici le code utilisé:

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
                        1,
                        user.UserId,
                        DateTime.Now,
                        DateTime.MaxValue,
                        false,
                        user.UserType);

HttpCookie cookie = new HttpCookie(
     FormsAuthentication.FormsCookieName, 
     FormsAuthentication.Encrypt(ticket));

Response.Cookies.Add(cookie);

Cependant, la lecture de ce retour sur le prochain Request, je trouve que le champ UserData est maintenant vide:

string encryptedCookie = Request.Cookies[ FormsAuthentication.FormsCookieName ].Value;
FormsAuthenticationticket ticket = FormsAuthentication.Decrypt(encryptedCookie);
Assert.IsTrue( ticket.UserData.Length == 0 ); //TRUE!

Toutes les idées?

Était-ce utile?

La solution

Je pense avoir trouvé le problème. Si vous faites votre propre nom de cookie, il semble être bien! Ainsi, le changement de:

HttpCookie cookie = new HttpCookie(
     FormsAuthentication.FormsCookieName, 
     FormsAuthentication.Encrypt(ticket));

à

HttpCookie cookie = new HttpCookie(
     "SiteCookie", 
     FormsAuthentication.Encrypt(ticket));

Et puis récupérer selon la question:

string encryptedCookie = Request.Cookies[ "SiteCookie" ].Value;
FormsAuthenticationticket ticket = FormsAuthentication.Decrypt(encryptedCookie);
Assert.IsFalse( ticket.UserData.Length == 0 ); //Hooray! It works

Son .NET possible fait certaines choses difficiles avec lui, donc en le plaçant dans un nouveau fonctionne très bien.

Mise à jour:

En outre, les besoins des billets à rafraîchir, sinon le billet expirera lorsque l'utilisateur utilise le site:

FormsAuthentication.RenewTicketIfOld(ticket); // Do before saving cookie

Autres conseils

Cela fonctionne pour moi:

//Create Form Authentication ticket
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, currentUser.userid.ToString(), DateTime.Now, DateTime.Now.AddMinutes(60), false, currentUser.ToString(), FormsAuthentication.FormsCookiePath);

string hashCookies = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashCookies);
cookie.HttpOnly = true;
HttpContext.Current.Response.Cookies.Add(cookie);

J'ai également rencontré ce problème. Mais je pense que la vraie raison est que le serveur mis le même cookie deux fois et la deuxième override la première qui contient votre champ UserData.

Vous pouvez capturer le processus d'écriture des cookies par Fiddler, et est une capture d'écran ici qui montrent ce problème: entrer image description ici

Alors, comment cela est arrivé? Dans ma situation, j'utilise le contrôle de connexion pour authentifier. Dans le cas Authentifier de contrôle de connexion, je mets le cookie avec mon UserData après vérifier le nom d'utilisateur et mot de passe manaully. Ensuite, je mets le AuthenticateEventArgs.Authenticated=true, à ce moment, dans la fenêtre de débogage, je vois un nouveau cookie est mis en attente à la réponse dont le nom est aussi égal à FormsAuthentication.FormsCookieName! Ma solution est redirection vers la page par défaut au lieu de régler la AuthenticateEventArgs.Authenticated = true.

Alors, vous pouvez déboguer votre code pour voir si le cookie d'authentification est mis en attente à la réponse deux fois.

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