Domanda

Ho creato una FormsAuthenticationTicket da zero, ma ha rilevato che durante il recupero di esso in un secondo momento, il UserData non tornerà. Ecco il codice utilizzato:

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);

Tuttavia, quando la lettura di questo ritorno sul prossimo Request, ho trovato che il campo UserData ora è vuota:

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

Tutte le idee?

È stato utile?

Soluzione

Credo che ho trovato il problema. Se si effettua il proprio nome del cookie sembra essere bene! Quindi, il cambiamento da:

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

a

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

E poi recuperarlo come per la domanda:

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

E 'possibile .NET fa alcune cose difficile con esso, in modo da metterlo in una nuova funziona bene.

UPDATE:

Inoltre, le esigenze del biglietto per essere aggiornati, altrimenti il ??biglietto scade mentre l'utente sta utilizzando il sito:

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

Altri suggerimenti

Questo funziona per me:

//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);

Ho anche riscontrato questo problema. Ma penso che la vera ragione è che il server impostato lo stesso cookie due volte e la seconda esclusione del primo, che contiene il campo UserData.

È possibile catturare il processo di scrittura dei cookie da Fiddler, ed ecco uno screenshot che mostrano questo problema: entrare descrizione dell'immagine qui

Quindi, come questo è accaduto? Nella mia situazione, io uso il controllo Login autenticare. Nel caso in Autentica del controllo Login, ho impostato il cookie con il mio UserData dopo il check-il nome utente e la password manaully. Poi, ho impostato il AuthenticateEventArgs.Authenticated=true, in questo momento, nella finestra di debug, vedo un nuovo cookie si accoda alla risposta il cui nome è uguale anche per FormsAuthentication.FormsCookieName! La mia soluzione è reindirizzamento alla pagina di default invece di impostare l'AuthenticateEventArgs.Authenticated = true.

Quindi, è possibile eseguire il debug del codice per vedere se il cookie di autenticazione si accoda alla risposta due volte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top