15

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

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

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

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

Request.Cookies["MyKey"] != null

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

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

4

3 回答 3

18

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

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

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

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

于 2013-07-21T16:50:24.143 回答
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());
    }

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

也可以看看:

于 2018-01-17T20:41:40.497 回答
0

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

但是,这实际上不是使用 cookie 保护某些东西的安全方法,因为 cookie 实际上永远有效。cookie 是否被丢弃取决于客户端实现。如果某个坏人拦截了您的 cookie,他们将永远可以访问。

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

于 2013-07-20T17:02:50.537 回答