我正在创建一个httpcookie,只设置名称和值而不是expies属性,然后将其添加到响应中。简单。按预期创建(但不持久)cookie。问题是会话发生在某种原因(如网站重建时,或者我在调试时重建我的应用),那么cookie会留下来。我希望cookie仅对它创建的原始会话有效。

根据msdn它说:“如果您没有为cookie指定过期限制,则cookie不会持久地持续到客户端计算机,并且当用户会话到期时它会到期。”

我想我不知道究竟是什么“会话到期”所包含的。我认为在会话到期后20分钟后,cookie会被删除。但是如果在任何原因未被创建的会话时,Cookie会被删除,但由于任何原因不再存在?我看到cookie删除的唯一时间是当用户关闭所有浏览器窗口并打开一个新的浏览器时。

如果这一切都是真的,我可能必须在cookie中存储原始会话ID(“ASP.NET_SESSIONID”),然后检查其对当前会话ID,如果它们不同,则删除cookie或创建一个新的。

这是代码(我的cookie与msdn示例中的唯一区别是我在cookie中存储多个值):

private void SaveValuesToCookie(string[] names, string[] values)
{
    HttpCookie cookie = new HttpCookie("MyCookie");

    for (int i = 0; i < names.Length; i++)
    {
        string name = names[i];
        cookie.Values[name] = values[i];
    }
    Response.Cookies.Add(cookie);
}

private string GetValueFromCookie(string name)
{
    HttpCookie cookie = Request.Cookies["MyCookie"];
    if (cookie == null)
        return null;

    return cookie.Values[name];
}
.

有帮助吗?

解决方案

我见过cookie的唯一一次 删除是用户关闭所有的时候 浏览器Windows并打开一个新的。

并且这正是MSDN意味着当会话到期时将删除cookie。不幸的是,无论如何,我相信这在浏览器中并不是一致的,所以对任何人都没有太多用。

您应该始终在cookie上设置有效期。

如果这一切都是真的,我可能需要 存储原始会话ID (“asp.net_sessionid”)在cookie中, 然后检查一下当前 会话ID,如果它们不同,那么 删除cookie或创建新的cookie。

我讨厌说出来,但这也不会帮助你。 .NET Framework喜欢回收会话ID,因此您无法保证它将是不同的。

不好的消息,我会建议你重新考虑你想要从架构角度来看什么。

重新启动应用程序是完全在服务器上发生的东西; cookie是完全在客户端发生的东西。虽然客户端将与服务器交谈,但它纯粹是一个请求/响应关系,但服务器无法传送诸如应用程序的事件(如应用程序)重新启动到浏览器。

如果要将值存储在某个位置,这仅适用于服务器会话的寿命,为什么不将其存储在会话中而不是在cookie中?

其他提示

我知道这一切,但这对我们的客户需求不够安全。会话仍然可以欺骗或注入。请参阅: http://msdn.microsoft.com/en-us/杂志/ cc163730.aspx#s9

看起来我留下了创建一个已分开的会话的过期的安全cookie,并在我可以时刷新到期日期(即,当用户访问某些页面时)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top