FormsAuthentication non è preservare il campo UserData dopo il postback in .NET 3.5
-
01-10-2019 - |
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?
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:
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.