使用cookie在ASP MVC中存储会话

时间:2009-10-30 17:55:02

标签: asp.net-mvc session-state

在过去的几年里,将整个会话存储在cookie中已成为Rails的标准 - 有没有一种简单的方法来实现与ASP MVC类似的东西?

默认情况下,Session / TempData中的任何内容都存储在服务器的内存中。在web.config中,可以将其更改为SQL Store /服务器端缓存。我希望能够将这些对象保存在cookie中。

看起来我可以实现自定义会话状态存储提供程序。有更简单的方法吗?

6 个答案:

答案 0 :(得分:5)

我认为在cookie中存储会话ID(散列或其他)会更高效,然后使用该ID从内存/数据库/您喜欢的任何存储中获取会话数据。保持cookie中的完整会话状态会不必要地增加带宽。

另外,请记住安全性:如果cookie包含身份验证信息或其他敏感数据并且您不小心,则很容易被用户攻击以获取权限或以其他方式弄乱您的应用程序(加密数据也很糟糕) ,因为那时你必须对加密数据进行base-64编码,这会进一步浪费带宽和处理时间)。您应该从不信任来自用户的输入。

答案 1 :(得分:4)

是的,实施custom state session-provider。不,不,没有更简单的方法。

聚苯乙烯。它没有它看起来那么糟糕,即> odbc sample的一半正在写入数据库。

答案 2 :(得分:2)

我强烈反对将整个会话存储在cookie中。它具有糟糕的性能影响。考虑一下:每个请求(对每个资源)都会包含一些可能过时的数据,只需要一次或两次。最终,这种开销会影响用户,带宽和网站性能。

以下是一个例子:

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

初始请求大小约为200字节。假设您在会话中添加大约100个字节。现在大小为300字节,开销约为30%。您再添加100个字节,开销为50%。这意味着它大约需要2倍的时间来发送请求和2倍的带宽。

你应该考虑cookie-based TempData implementation,因为它的占地面积小得多,实际上是有意义的。

答案 3 :(得分:0)

我建议在Cookie中存储TempData(而不是整个会话)。

要在Cookie中存储TempData,您需要覆盖ITempDataProvider并实施自己的自定义提供程序。

实际上有一个nuget包可用(为您执行此自定义实现):BrockAllen.CookieTempDatahere is the documentation。这个软件包的好处是它可以压缩和加密TempData,因此您不必担心通过Internet发送纯文本。

您需要做的就是安装nuget软件包,然后覆盖CreateTempDataProvider课程中的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();
        }
    }
}

答案 4 :(得分:-1)

您不应该使用Sessions,而是使用Profiles。配置文件使用cookie将计算机与配置文件等匹配。配置文件密钥存储在cookie中,关闭浏览器等时不会丢失。

信息在这里; http://odetocode.com/articles/440.aspx

答案 5 :(得分:-2)

取决于您要在cookie中存储的数据类型,如果您只想存储字符串,以下代码将执行:

HttpCookie cookie = new HttpCookie("username","sth");
            cookie.HttpOnly = true;
            cookie.Expires = DateTime.Now.AddMonths(3);
            HttpContext.Current.Response.Cookies.Add(cookie);