FormsAuthentication no es preservar el campo UserData después de devolución de datos en .NET 3.5
-
01-10-2019 - |
Pregunta
He creado un FormsAuthenticationTicket
desde cero, pero encontró que cuando se recuperan en un momento más tarde, el UserData
no va a volver. Este es el código utilizado:
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);
Sin embargo, al leer esto de nuevo en la siguiente Request
, he encontrado que el campo UserData
es ahora vacío:
string encryptedCookie = Request.Cookies[ FormsAuthentication.FormsCookieName ].Value;
FormsAuthenticationticket ticket = FormsAuthentication.Decrypt(encryptedCookie);
Assert.IsTrue( ticket.UserData.Length == 0 ); //TRUE!
¿Alguna idea?
Solución
creo que he encontrado el problema. Si usted se inventa su propio nombre de la cookie parece estar bien! Así que el cambio de:
HttpCookie cookie = new HttpCookie(
FormsAuthentication.FormsCookieName,
FormsAuthentication.Encrypt(ticket));
a
HttpCookie cookie = new HttpCookie(
"SiteCookie",
FormsAuthentication.Encrypt(ticket));
Y luego recuperarlo de acuerdo con la pregunta:
string encryptedCookie = Request.Cookies[ "SiteCookie" ].Value;
FormsAuthenticationticket ticket = FormsAuthentication.Decrypt(encryptedCookie);
Assert.IsFalse( ticket.UserData.Length == 0 ); //Hooray! It works
Su posible .NET hace algunas cosas difíciles con él, por lo que al ponerlo en un nuevo bien funciona.
ACTUALIZACIÓN:
Además, las necesidades de billetes se actualicen, ya que de lo contrario el billete expirará mientras que el usuario está utilizando el sitio web:
FormsAuthentication.RenewTicketIfOld(ticket); // Do before saving cookie
Otros consejos
Esto funciona para mí:
//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);
También he encontrado con este problema. Pero creo que la verdadera razón es que el servidor establece la misma cookie dos veces y la segunda anulación de la primera, que contiene su campo UserData.
Puede capturar el proceso de escritura de cookies por Fiddler, y aquí es una captura de pantalla que muestran este problema:
Entonces, ¿cómo sucedió esto? En mi situación, yo uso el control de sesión para autenticar. En caso de Autenticación del control de sesión, me puse la cookie con mi UserData después de comprobar el nombre de usuario y contraseña manaully. Entonces, me puse la AuthenticateEventArgs.Authenticated=true
, en este momento, en la ventana de depuración, veo una nueva cookie se pone en cola para la respuesta cuyo nombre es también igual a FormsAuthentication.FormsCookieName! Mi solución es redirección a la página por defecto en lugar de establecer la AuthenticateEventArgs.Authenticated = true.
Por lo tanto, es posible depurar el código para ver si la cookie de autenticación se pone en cola a la respuesta dos veces.