在 ASP MVC 中使用 cookie 存储会话
-
22-07-2019 - |
题
在过去的几年里,将整个会话存储在 cookie 中已成为 Rails 的标准 - 有没有一种简单的方法可以使用 ASP MVC 实现类似的功能?
默认情况下,Session / TempData 中的任何内容都存储在服务器的内存中。在 web.config 中,可以将其更改为 SQL 存储/服务器端缓存。我希望能够将这些对象保存在 cookie 中。
看起来我可以实现一个自定义会话状态存储提供程序。有没有更简单的方法?
解决方案
是,实现定制状态会话提供商。和没有,AFAIK没有一个更简单的方法。
聚苯乙烯。它并不像坏,因为它看起来即> ODBC示例<一半/一>被写入分贝。
其他提示
我认为这将是更有效,只是存储在cookie中的会话ID(散列或其他),然后使用该ID从内存/数据库/你喜欢的任何存储获取会话数据。在cookie中增加保持完整会话状态innecessarily带宽。
此外,保持安全考虑的:如果cookie包含身份验证信息或其他敏感数据和你不小心,它可以很容易地被用户砍死获得特权或以其他方式破坏你的应用程序(对数据进行加密太烂太,因为这样你必须碱基64编码的加密数据,其中,还浪费了带宽和处理时间)。你应该的从不的来自用户的信任输入。
我强烈反对将整个会话存储在 cookie 中。它会对性能产生不良影响。考虑一下:每个请求(对每个资源)都将包含可能陈旧数据的开销,您只需要一次或两次。最终,这种开销将影响您的用户、带宽和网站性能。
这是一个例子:
GET / HTTP/1.1
Host: localhost
OtherUsefulHeaders: foo
Cookie: YourSessionState=...
初始请求大小约为 200 字节。假设您向会话添加了大约 100 个字节。现在大小为 300 字节,开销约为 30%。再添加 100 个字节,开销为 50%。这意味着发送请求大约需要 2 倍的时间和 2 倍的带宽。
你应该看看 基于 cookie 的 TempData 实现 因为它的占地面积要小得多,而且实际上很有意义。
我建议存储 TempData
在 cookie 中(而不是整个会话)。
为了存储 TempData
在cookie中,你需要覆盖 ITempDataProvider
并实现您自己的自定义提供程序。
实际上有一个可用的 nuget 包(它为您执行此自定义实现): 布罗克艾伦.CookieTempData 和 这是文档. 。这个包的好处是它可以压缩和加密您的文件 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();
}
}
}
您不应该使用会话这一点,但配置文件来代替。型材使用cookie来匹配计算机型材等轮廓密钥被存储在cookie中,和关闭浏览器等时不丢失
取决于你想,如果你想在cookie中存储,只存储字符串什么样的数据,下面的代码就可以了:
HttpCookie cookie = new HttpCookie("username","sth");
cookie.HttpOnly = true;
cookie.Expires = DateTime.Now.AddMonths(3);
HttpContext.Current.Response.Cookies.Add(cookie);