FormsAuthentication no es preservar el campo UserData después de devolución de datos en .NET 3.5

StackOverflow https://stackoverflow.com/questions/3669204

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?

¿Fue útil?

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: introducir descripción de la imagen aquí

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top