3

我正在创建一个 HttpCookie,只设置名称和值而不是 expires 属性,然后将其添加到响应中。很简单。cookie 按预期创建(但不持久)。问题是当会话由于某种原因发生变化时(比如网站被重建,或者我在调试时重建了我的应用程序)然后 cookie 仍然存在。我希望 cookie 仅对创建它的原始会话有效。

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

我想我不确切知道“会话过期”包含什么。我认为 cookie 会在会话过期 20 分钟后被删除。但是,如果创建它的会话由于各种原因不再存在,是否应该删除 cookie?我唯一一次看到 cookie 被删除是当用户关闭所有浏览器窗口并打开一个新窗口时。

如果这一切都是真的,我可能必须将原始会话 ID(“ASP.NET_SessionId”)存储在 cookie 中,然后根据当前会话 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];
}
4

2 回答 2

3

我唯一一次看到 cookie 被删除是当用户关闭所有浏览器窗口并打开一个新窗口时。

这正是 MSDN 所说的会话到期时将删除 cookie 的意思。不幸的是,我相信这在浏览器中并不一致,所以它对任何人都没有多大用处。

您应该始终设置 Cookie 的到期日期。

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

我不想这么说,但这也无济于事。.NET Framework 喜欢回收会话 ID,因此您不能保证它会有所不同。

坏消息,我建议你从架构的角度重新考虑你正在尝试做的事情。

重新启动应用程序是完全在服务器上发生的事情;cookie 是完全在客户端发生的事情。虽然客户端将与服务器通信,但它纯粹是请求/响应关系,服务器无法将应用程序重启等事件传达给浏览器。

如果您想在某个地方存储一个仅在服务器会话的生命周期内有效的值,为什么不将它存储在 Session 而不是 Cookie 中呢?

于 2010-07-20T18:09:38.113 回答
0

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

看起来我只能创建一个与会话分开的过期安全 cookie,并尽可能刷新过期日期(即当用户访问某些页面时)。

于 2010-07-21T14:52:44.380 回答