2010-07-27 19 views
8

Estoy buscando alguna orientación con respecto a las cookies en ASP.Net MVC (o simplemente manejo de cookies en general). He estado almacenando información de autenticación sobre usuarios que se autentican mediante un inicio de sesión de formulario en una cookie. Esto funciona muy bien, pero ahora necesito almacenar un poco más de información en la cookie. Esta información adicional no es realmente "relacionada con la autenticación", por lo que dudo en almacenarla en el ticket de autenticación. ¿Existe una mejor práctica para almacenar información adicional? ¿Es posible establecer varias cookies (y si es así, una buena/mala práctica)? ¿Otras cosas que debería considerar aquí?ASP.Net MVC Cookies Mejores prácticas

Aquí está el código actual que estoy usando para establecer el vale de autenticación y se envuelve en una cookie:

private HttpCookie GetAuthCookie(AuthToken authToken) 
{ 
    var authTokenXml = serializationService.Serialize(authToken); 
    var authCookieString = FormsAuthentication.Encrypt(
     new FormsAuthenticationTicket(
      0, 
      Keys.AuthToken, 
      DateTime.Now, 
      DateTime.Now.AddMinutes(AppSettings.SessionTimeoutMinutes), 
      true, 
      authTokenXml)); 
    var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, authCookieString) 
        { 
         Expires = DateTime.Now.AddDays(AppSettings.AuthCookieExpireDays) 
        }; 
    return cookie; 
} 

Respuesta

2

Existe un límite de tamaño a lo grande que una cookie puede ser, de 4096 bytes. Después de esto, es posible que deba dividir los datos en varias cookies si desea continuar almacenando en las cookies. Obviamente, ahora tiene la complejidad adicional de leer de todos para reconstruir su ticket de autenticación + datos y, si una cookie no se envió con el resto, puede tener algunas consecuencias nefastas.

¿Ha considerado utilizar una tienda de sesiones diferente? Eso es efectivamente lo que está usando la cookie como aquí y, a menos que esté relacionado con la autenticación y deba estar disponible en la línea de procesamiento antes de que la sesión sea accesible, me inclinaría a considerar poner esto en sesión. Puede usar una tienda de sesión fuera de proceso, como una base de datos, si no desea almacenar la sesión en proceso.

+0

Sí, he estado considerando usar el estado de sesión del servidor SQL como alternativa al enfoque de cookies. Los datos adicionales que necesito almacenar son pequeños (probablemente 20 caracteres), por lo que no debería agregar demasiada sobrecarga en el cable ni en términos de tamaño de la cookie. Esperaba evitar el uso de una base de datos solo para almacenar esta información adicional, a menos que sea realmente la mejor práctica, y es por eso que hice la pregunta aquí. Gracias por sus comentarios. – Paul

+0

si solo tiene 20 caracteres, probablemente no esté haciendo ningún daño en la cookie. Si es así de pequeño, usar la sesión de proc también podría ser una buena opción. Tal vez intente de ambas formas y vea cuál es preferible. –

1

No debe poner nada más que datos de autenticación en la cookie de autenticación. El uso de Asp.net de cookies es muy similar al de cualquier plataforma de programación para web. Puede establecer tantas cookies como desee y almacenar en ellas lo que desee. Algunos ejemplos:

http://www.cookiecentral.com/faq/

http://stephenwalther.com/blog/archive/2008/07/08/asp-net-mvc-tip-15-pass-browser-cookies-and-server-variables-as-action-parameters.aspx

http://www.asp.net/general/videos/read-write-and-delete-cookies-in-aspnet

12

La regla de oro: conservar en la cookie sólo el mínimo (por lo general este es el identificador de usuario) y el uso de este mínimo a buscar el resto de su almacén de datos cada vez que lo necesite. Si está satisfecho con el rendimiento, puede dejar de leer.

Si se da cuenta de que hay demasiadas consultas en su almacén de datos, puede utilizar la sesión o almacenar en caché los resultados de sus consultas.

Cuestiones relacionadas