Pregunta

Estoy intentando implementar la "Escritura de información en datos de usuario" sección de este artículo , pero no funciona correctamente cuando la cookie es parte del URI.

Mi código:

// Create the cookie that contains the forms authentication ticket
HttpCookie authCookie = FormsAuthentication.GetAuthCookie( userName, createPersistantCookie );

// Get the FormsAuthenticationTicket out of the encrypted cookie
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt( authCookie.Value );

// Create a new FormsAuthenticationTicket that includes our custom User Data
FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket( ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, "foo");

// Update the authCookie's Value to use the encrypted version of newTicket
authCookie.Value = FormsAuthentication.Encrypt( newTicket );

// Manually add the authCookie to the Cookies collection
HttpContext.Current.Response.Cookies.Add( authCookie );

// Determine redirect URL and send user there
string redirUrl = FormsAuthentication.GetRedirectUrl( userName, createPersistantCookie );

HttpContext.Current.Response.Redirect( redirUrl, false );

Cuando se utiliza sin cookies, la página redirige pero no obtiene el URI correcto con la información de la cookie, por lo que vuelve a mi página de inicio de sesión donde Request.IsAuthenticated devuelve falso. Se produce un bucle sin fin.

¿Cómo redirijo al URI adecuado?

¿Fue útil?

Solución

Me pareció que este era un problema interesante, así que me puse a cavar, probar y un poco de depuración en la fuente del framework .net.

Básicamente, lo que intentas hacer no funcionará. Cualquier cosa que coloque en la colección Response.Cookies simplemente se ignorará si el navegador no admite cookies. Puede consultar Request.Browser.Cookies para ver si las cookies son compatibles.

En asp.net, tanto el estado de sesión como la autenticación admiten un modo sin cookies, pero esto no se extiende a otras cookies. De hecho, parece que incluso la sesión y la autenticación se pueden configurar en diferentes modos de operación.

El sistema de autenticación puede almacenar sus propios datos en el URI, pero lo hace manipulando directamente el URI. Lamentablemente, Microsoft no parece haber expuesto estas capacidades al código fuera del módulo de autenticación.

Básicamente, si usa los métodos como FormsAuthentication.GetAuthCookie () y FormsAuthentication.SetAuthCookie (), el sistema de autenticación se encargará de poner esa información en el URI automáticamente ... pero no le permite proporcione un ticket de autenticación personalizado para estos métodos ... de modo que se quede atascado con el ticket de autenticación predeterminado. En estos casos, usted es el único responsable del almacenamiento de datos personalizados.

De todos modos ...

Realmente no hay mucha ventaja en almacenar datos personalizados directamente en un ticket de autenticación si el sistema de autenticación se ha vuelto sin cookies ... en modo sin cookies, cosas como "cookies persistentes" no tiene sentido, por lo que estará regenerando los datos al menos una vez por sesión de todos modos.

La sugerencia más común para los casos en los que no tiene cookies pero aún necesita datos personalizados como este es habilitar sesiones sin cookies y simplemente almacenar sus datos personalizados como una variable de sesión. El ID de sesión se colocará en el URI, pero los datos personalizados permanecerán en la memoria del servidor. El patrón de uso es idéntico sin importar si sus sesiones son sin cookies o no.

Si realmente quisiera, podría idear un sistema de almacenamiento de datos personalizados en el URI manualmente. Lo más fácil sería colocar los datos personalizados en cadenas de consulta o usar datos de ruta.

Otros consejos

Gracias por la gran explicación, Stephen. En los casos en que el usuario no permita cookies, solo tendré que evitar los Datos de usuario y cargar los datos de la base de datos.

Antes del código mencionado anteriormente, haré:

if( !HttpContext.Current.Request.Browser.Cookies || !FormsAuthentication.CookiesSupported )
{
    FormsAuthentication.RedirectFromLoginPage( userName, false);
    return;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top