【问题标题】:Using cookies to store session in ASP MVC在 ASP MVC 中使用 cookie 存储会话
【发布时间】:2018-06-24 14:45:37
【问题描述】:

在过去几年中,将整个会话存储在 cookie 中已成为 Rails 的标准 - 是否有一种简单的方法可以使用 ASP MVC 实现类似的功能?

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

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

【问题讨论】:

  • 您的意思是输入“cookie 中的整个会话”吗?

标签: asp.net-mvc session-state


【解决方案1】:

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

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

【讨论】:

  • 在这种情况下是否需要自定义会话状态存储,或者在 web.config 中禁用会话是否有意义?
【解决方案2】:

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

附言。它并不像看起来那么糟糕,即 > 一半的 odbc sample 正在写入数据库。

【讨论】:

  • 在此之后,我实现了一个自定义状态会话提供程序,它确实很简单。感谢您的帮助。
【解决方案3】:

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

这是一个例子:

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

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

您应该研究一下cookie-based TempData implementation,因为它占用的空间要小得多,而且实际上很有意义。

【讨论】:

  • 如何通过 TempData(通过 cookie 存储实现)维护会话信息更快?维护该 TempData 还会产生额外的代码开销。一个会话应该相当轻——在我们的例子中它只有几十个字节——所以请求的开销应该是最小的。基于 cookie 的会话存储在 2007 年被 Rails 采用为标准。本文讨论了他们采取这一举措的原因。 ryandaigle.com/articles/2007/2/21/…
  • 我为 Rails 社区感到非常高兴,但我的观点是基于统计数据:yuiblog.com/blog/2007/03/01/performance-research-part-3。 TempData 优于会话,因为它的开销只应用一次——在页面往返期间。否则饼干应该是干净的。无论如何,在 web-farm 场景中经历了一段痛苦的经历后,我根本不使用 Session,这不值得。
  • 您现在使用什么方法来获取会话状态?我会认为会话对象(无论是否 inproc)或 cookie 是唯一的选择?
  • @UpTheCreek - 我编写的代码不依赖于会话状态。每条信息都可以从请求中重建(包括 cookie)或存储在缓存/数据库中(如果重新计算成本很高)。
【解决方案4】:

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

为了将TempData 存储在cookie 中,您需要覆盖ITempDataProvider 并实现您自己的自定义提供程序。

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

您需要做的就是安装 nuget 包,然后在您的 ControllerBase 类中覆盖 CreateTempDataProvider

using BrockAllen.CookieTempData;

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

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      取决于你想在cookie中存储什么样的数据,如果你只想存储字符串,下面的代码就可以了:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-05
        • 1970-01-01
        • 2023-03-25
        • 2014-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-26
        相关资源
        最近更新 更多