当浏览器会话结束时,Cookie将过期。

16

我的研究表明,如果我创建一个cookie并且不设置过期日期,那么当浏览器关闭时它会过期。

所以我这样创建了一个cookie:

Response.Cookies.Set(new HttpCookie("MyKey", "X"));

但是当我关闭浏览器然后重新打开它时,以下表达式的值为真:

但是当我关闭浏览器然后重新打开它时,以下表达式的值为 true:

Request.Cookies["MyKey"] != null

当浏览器会话结束时,如何使cookie过期?

注意:对于我的目的来说,使用静态数据而不是cookie似乎更理想。但是,我的理解是ASP.NET可能会因多种原因重新启动,如果我丢失此设置,那么当前用户可能会受到影响。


1
你想让服务器上的cookie在浏览器会话结束后过期吗?当浏览器关闭后,你如何检查Request.Cookies["MyKey"]的值? - Stobor
3
"自动加载之前打开的页面" - 我猜您的浏览器启用了某种形式的“恢复上次位置”设置。开启该设置后,浏览器会话在您退出浏览器时不会结束;因此退出浏览器不会触发 cookie 的删除。 - Stobor
1
是的,在Chrome中这是相关设置:https://support.google.com/chrome/answer/95421 - Stobor
1
可能是与https://dev59.com/EG865IYBdhLWcg3wl_s3相似的问题。 - goodeye
@good eye:我不明白为什么在这个问题已经有很多评论和几个答案的几个月后,还要建议这个问题可能是重复的。此外,你引用的那个问题是不同的。那个问题是关于如何设置cookie过期时间的,而我在这里提出的问题是为什么它并不总是有效。 - Jonathan Wood
显示剩余10条评论
3个回答

18

看起来问题就像Stober描述的那样。您可以通过将HttpCookie.Expires属性设置为DateTime.MinDate或不设置该属性来使cookie在浏览器会话结束时过期。

但是,至少对于Chrome的从上次离开的地方继续设置,似乎浏览器会话并不一定在关闭浏览器时结束。当关闭然后重新打开Chrome浏览器时,它会恢复到上次离开的地方,就好像会话从未结束过一样。这包括继续使用设置为会话结束后过期的cookie。

我在FireFox上尝试了相同的代码。关闭和重新打开浏览器会导致cookie过期,完全符合预期。

因此,虽然有一些通用规则,但最终行为完全取决于浏览器。


1
您可以在下一个Session_start事件中捕获此错误。如果在全新的会话开始时已经有了经过身份验证的用户,则必须从旧cookie中获取该信息。只需将用户信息设置为空,并让登录重定向来处理其余部分。在global.asax.cs文件中可以类似以下方式实现:
protected void Session_start()
{
    // starting a session and already authenticated means we have an old cookie
    var existingUser = System.Web.HttpContext.Current.User;
    if (existingUser != null && existingUser.Identity.Name != "")
    {
        // clear any existing cookies
        IAuthenticationManager authMgr = System.Web.HttpContext.Current.GetOwinContext().Authentication;
        authMgr.SignOut("MyCookieType")

        // manually clear user from HttpContext so Authorize attr works
        System.Web.HttpContext.Current.User = new ClaimsPrincipal(new ClaimsIdentity());
    }

}
  • 根据用户身份验证方式不同,代码可能会有所不同

另请参阅:


0

只需将您的HttpCookie实例的Expires属性设置为DateTime.MinDate,它将在浏览器会话结束后过期。

然而,这实际上不是一种安全的方式来使用cookie保护某些内容,因为cookie实际上是永久有效的。它取决于客户端实现是否丢弃cookie。如果有坏人拦截了您的cookie,他们将永远访问。

另请参阅:MSDN-Cookie.Expires属性


将过期日期设置为 DataTime.MinDate 的效果与不设置过期日期完全相同。在 Chrome(至少在某些设置下),这意味着当浏览器会话结束时,Cookie 不会过期。(或者至少在关闭浏览器时,“浏览器会话”不会结束。) - Jonathan Wood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接