浏览器会话结束时 Cookie 过期

Posted

技术标签:

【中文标题】浏览器会话结束时 Cookie 过期【英文标题】:Cookie to Expire when Browser Session Ends 【发布时间】:2013-07-18 04:29:27 【问题描述】:

我的研究表明,如果我创建了一个 cookie 并且没有设置过期日期,它会在浏览器关闭时过期。

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

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

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

Request.Cookies["MyKey"] != null

如何在浏览器会话结束时让 cookie 过期?

注意:就我的目的而言,使用静态数据而不是 cookie 似乎是理想的。但我的理解是,ASP.NET 可能会因多种原因重新启动,如果我丢失了此设置,这可能会从当前用户下拉出地毯。

【问题讨论】:

你想让服务器上的cookie在浏览器会话结束后过期吗?关闭浏览器后如何查看Request.Cookies["MyKey"]的值? 我想要客户端的 cookie,而不是服务器。当浏览器重新打开并重新加载页面时,我会在浏览器关闭后检查 cookie 的值。 “它会自动加载之前打开的页面” - 我怀疑您的浏览器启用了某种形式的“重新加载我之前的位置”设置。启用后,退出浏览器时浏览器会话不会结束;所以退出浏览器不会触发cookie的删除。 是的,这是 Chrome 中的相关设置:support.google.com/chrome/answer/95421 ***.com/questions/3737285/…的可能重复 【参考方案1】:

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

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

我在 FireFox 上尝试了相同的代码。关闭并重新打开浏览器会导致 cookie 过期,正如预期的那样。

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

【讨论】:

【参考方案2】:

您可以在下一个 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());
    


代码可能会有所不同,具体取决于您对用户进行身份验证的方式

另见:

Expire cookie at end of session OR at specific time? ASP.Net delete/expire session cookies

【讨论】:

【参考方案3】:

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

然而,这实际上是不安全的方式用 cookie 保护某些东西,因为 cookie 实际上是永久有效的。 cookie 是否被丢弃取决于客户端实现。如果某些坏人拦截了您的 cookie,他们将永远拥有访问权限。

另请参阅:MSDN - Cookie.Expires Property

【讨论】:

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

以上是关于浏览器会话结束时 Cookie 过期的主要内容,如果未能解决你的问题,请参考以下文章

将cookie设置为在会话结束时过期?网

cookies不设置过期时间默认是永远不过期吗

Firefox 会话 cookie

五十九:Flask.Cookie之flask设置cookie过期时间

PHP会话cookie在浏览器关闭时过期

前端缓存(cookieslocalStoragesessionStorage)