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

Posted

技术标签:

【中文标题】将cookie设置为在会话结束时过期?网【英文标题】:set cookie to expire at end of session? asp.net 【发布时间】:2011-04-13 19:56:01 【问题描述】:

我很惊讶我找不到任何答案。

如何将我的 cookie 中的 sessionid 设置为在会话结束时过期? (当浏览器关闭或用户一段时间不活动时)。

我找到的两个解决方案是

(httpcookie).Expires = HttpContext.Current.Session.Timeout

这给了我一个编译错误,所以我不知道用户在发布之前是否检查了他的代码。另一种是将过期日期设置为 1 天前,我的直觉认为这是错误的。我该怎么做?

【问题讨论】:

***.com/questions/12582689/… 【参考方案1】:

不要使用登录控件,它会增加难度。

protected void btnLogin_Click(object sender, EventArgs e) 

    // Check user and password in database
    bool isValidUser = ValidateUser(txtUsername.Text, txtPassword.Text);

    // Set cookie to be not persistent - this means if the user closes the browser, 
    //autentification cookie will be deleted and the user is not longer logged 
    bool isPersistentCookie = false;

    // Login user with the new username
    FormsAuthentication.SetAuthCookie(txtUsername.Text, isPersistentCookie);

【讨论】:

【参考方案2】:

请务必注意,如今您不能指望在用户关闭浏览器时删除会话 cookie。 Chrome 和 Firefox 早在 2012 年左右就做出了改变 - 请参阅this answer 的各种链接。

现在,未能删除会话 cookie 让我觉得这是一个可怕的、可怕的、不好的、非常糟糕的安全漏洞,更不用说违反了所有相关的 RFC,但显然我们的 Google(和 Mozilla)霸主更清楚。

我不确定最好的解决方法是什么,但我采取的方法是在每次调用后将 cookie 上的“Expires”属性重置为一个小时后。这并不完全是理想的行为,但我认为这比让关键的 cookie 基本上永远存在要好。

欢迎其他建议或澄清。

【讨论】:

如果您花时间构建 Cookie,它可以成为基于请求的负载平衡的救星。当然,没有什么是 100% 安全的,但 Cookie 中的 Encrypted Ticket 包是不使用其他混淆模式的最佳方法。【参考方案3】:

您说的是非持久性 cookie。默认情况下,asp.net 以这种方式发送 cookie。它们之间的主要区别在于持久性 cookie 设置了过期值。

因此,如果您不希望 cookie 持续存在,请不要设置 expires 值。

也就是说,cookie 将保留在内存中,直到浏览器真正关闭。假设他们浏览了您的网站,而您设置了一个非持久性 cookie。他们做事并浏览。稍后,他们使用相同的浏览器实例返回您的站点。 cookie 仍然存在。

现在,如果他们在任何时候关闭浏览器,cookie 就会被清除。

重点是,不要设置expires header。尤其是在会话日期到期时。会话日期通常只在未来 20 分钟左右,但到期日期会随着用户浏览您的网站而向前滚动。

===== 更新=====

我使用以下代码进行测试:

    protected void Page_Load(object sender, EventArgs e) 
        if (!Page.IsPostBack) 
            HttpCookie c = Request.Cookies["test"];
            if (c != null) 
                Response.Write(String.Format("test value is 0 <br />", c.Value));
            
         else 
            HttpCookie c = new HttpCookie("test");
            c.Value = "HERE IT IS";
            Response.Cookies.Add(c);
        
    

    protected void Button1_Click(object sender, EventArgs e) 
        Response.Write("clicked<br />");
    

.aspx 文件简单有一个按钮,它触发了 button1_click 处理程序。当我最初使用任何最新的浏览器(即 firefox、chrome)浏览它时,没有 cookie。单击按钮后,设置了一个 cookie。然后我完全关闭了浏览器,重新打开并浏览回该站点。在所有情况下,cookie 都消失了。

【讨论】:

很酷,所以解决方案是不要碰任何东西,只需设置 cookie 值并保留它。我认为还有更多。 在我将此标记为已接受之前,我想知道。我关闭了我的 firefox (3.6.10) 浏览器并重新打开它。我仍然登录。为什么?看起来提前 30 分钟更新/设置到期时间似乎是一个不错的解决方案。 您可能首先要删除与您的测试站点相关的所有 cookie。那就试试吧。此外,请确保关闭所有可能打开的 Firefox 实例。从您测试过期日期开始,cookie 可能仍然存在。 我刚刚用 Firefox 3.6.10 测试了它,它按预期清除了。 很奇怪。我知道我做对了,所以我再次测试了它。事实证明,我第一次打开了多个标签并使用了保存和退出功能。我不知道这会阻止 cookie 过期。做得好。 -edit- 我在opera上测试过,即使我用多个标签关闭它也会使cookies过期。我对这些结果很满意。【参考方案4】:

TimeOut 返回一个intExpires 期望DateTime,这就是该代码无法编译的原因。将过期日期设置为过去的日期会立即撤销 cookie,因此这可能不是您想要的。如果您未使用过期日期,则 cookie 将在用户关闭浏览器后立即过期。

如果您希望将 cookie 绑定到特定 Session,为什么首先要涉及 cookie?每次用户使用您的应用程序延长会话时,您当然可以继续延长 cookie 的到期日期,但这似乎是不必要的工作。只需使用会话。

请随意详细说明问题。

【讨论】:

这意味着跳过将内容保存到 cookie 并只使用会话。如果您确实需要知道如何使用会话,那么有一些问题。一个简短的例子是Session["someKey"] = someString; string retrievedValue = (string)Session["someKey"]; +1。我想提一下 HttpContext.Current.Session 是空的,所以我只是使用 cookie,并在每次用户访问时延长到期日期。 在某些情况下,尤其是网络农场,基于请求的负载均衡器无法保证 SessionState。在不使用状态管理实现的情况下,Cookie 是唯一可用的最佳方法。在我的例子中,我在 Cookie 中加入了一个加密票证并应用静态加密方法。

以上是关于将cookie设置为在会话结束时过期?网的主要内容,如果未能解决你的问题,请参考以下文章

PHP - 将会话变量设置为在 30 分钟后过期 [重复]

浏览器会话结束时 Cookie 过期

过期时间为“会话结束”的 cookie 啥时候过期?

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

烧瓶永久会话:在哪里定义它们?

具有expor = 0的setcookie不会在浏览器关闭后失效