Pregunta

Almacenar toda la sesión en una cookie ha sido estándar en Rails durante los últimos años. ¿Hay alguna manera fácil de lograr algo similar con ASP MVC?

Por defecto, cualquier cosa en Session / TempData se almacena en la memoria del servidor. En web.config, esto se puede cambiar a un almacén SQL / caché del lado del servidor. Me gustaría poder mantener estos objetos en una cookie.

Parece que podría implementar un proveedor de almacén de estado de sesión personalizado. ¿Hay un enfoque más simple?

¿Fue útil?

Solución

sí, implemente un proveedor de sesión de estado personalizado . Y no, afaik no hay un enfoque más simple.

Ps. no es tan malo como parece, es decir > la mitad de la muestra de odbc está escribiendo en el db.

Otros consejos

Creo que sería mucho más eficiente simplemente almacenar la ID de sesión (un hash o lo que sea) en la cookie, y luego usar esa ID para obtener los datos de la sesión de la memoria / base de datos / cualquier almacenamiento que prefiera. Mantener el estado de sesión completo en una cookie aumenta el ancho de banda innecesariamente.

Además, tenga en cuenta la seguridad: si la cookie contiene información de autenticación u otros datos confidenciales y no tiene cuidado, el usuario puede piratearla fácilmente para obtener privilegios o interferir con su aplicación (cifrar los datos también apesta , porque entonces tiene que codificar en base 64 los datos cifrados, lo que desperdicia aún más el ancho de banda y el tiempo de procesamiento). Usted debe nunca confiar en la entrada del usuario.

No recomendaría almacenar la sesión completa en cookies. Tiene implicaciones de mal rendimiento. Considere esto: cada solicitud (a cada recurso) contendrá una sobrecarga de datos posiblemente obsoletos que solo necesita una o dos veces. Finalmente, esta sobrecarga afectará a sus usuarios, a su ancho de banda y al rendimiento de su sitio.

Aquí hay un ejemplo:

GET / HTTP/1.1
Host: localhost
OtherUsefulHeaders: foo
Cookie: YourSessionState=...

El tamaño de la solicitud inicial es de alrededor de 200 bytes. Digamos que agrega alrededor de 100 bytes a su sesión. Ahora el tamaño es de 300 bytes y la sobrecarga es de ~ 30%. Agrega otros 100 bytes y la sobrecarga es del 50%. Lo que significa que requiere aproximadamente 2 veces más tiempo para enviar la solicitud y 2 veces más ancho de banda.

Debería buscar implementación de TempData basada en cookies ya que tiene una huella mucho menor y en realidad tiene sentido.

Recomiendo almacenar TempData en la cookie (en lugar de toda la sesión).

Para almacenar TempData en la cookie, debe anular ITempDataProvider e implementar su propio proveedor personalizado.

En realidad, hay un paquete nuget disponible (que hace esta implementación personalizada por usted): BrockAllen.CookieTempData y aquí está la documentación . Lo bueno de este paquete es que comprime y encripta tus TempData , por lo que no debes preocuparte por enviar texto sin formato a través de Internet.

Todo lo que necesita hacer es instalar el paquete nuget y luego anular CreateTempDataProvider en su clase ControllerBase :

using BrockAllen.CookieTempData;

namespace myProject.web.Controllers
{
    public class ControllerBase : Controller
    {
        // use CookieTempDataProvider instead of default provider
        protected override ITempDataProvider CreateTempDataProvider()
        {
            return new CookieTempDataProvider();
        }
    }
}

No deberías usar Sesiones para esto, sino Perfiles. Los perfiles usan cookies para hacer coincidir las computadoras con los perfiles, etc. La clave del perfil se almacena en una cookie y no se pierde al cerrar el navegador, etc.

Información aquí; http://odetocode.com/articles/440.aspx

depende del tipo de datos que desea almacenar en la cookie, si solo desea almacenar una cadena, el siguiente código servirá:

HttpCookie cookie = new HttpCookie("username","sth");
            cookie.HttpOnly = true;
            cookie.Expires = DateTime.Now.AddMonths(3);
            HttpContext.Current.Response.Cookies.Add(cookie);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top