设置cookie在会话结束时到期? asp.net

时间:2010-09-17 16:45:02

标签: asp.net session cookies

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

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

我找到的两个解决方案是

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

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

4 个答案:

答案 0 :(得分:51)

你在谈论一个非持久性cookie。默认情况下,asp.net以这种方式发送cookie。它们之间的主要区别在于持久性cookie具有过期值集。

因此,如果您不希望cookie保持不变,则不要设置expires值。

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

现在,如果他们在任何时候关闭了浏览器,那么cookie就会被刷新。

点是,不要设置expires头。特别是当会话日期到期时。会话日期通常在将来只有20分钟左右,但是当用户浏览您的网站时,到期日期会向前滚动。

===== update =====

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

    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都消失了。

答案 1 :(得分:8)

重要的是要注意,现在当用户关闭浏览器时,您不能指望删除会话cookie。 Chrome和Firefox都在2012年左右进行了更改 - 请参阅this answer上的各种链接。

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

我不确定最佳解决方法是什么,但我采取的方法是在每次通话后将Cookie上的“Expires”属性重置为将来一小时。这不是所期望的行为,但我认为这比允许关键的cookie基本上永远存在更好。

对其他建议或澄清持开放态度。

答案 2 :(得分:2)

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

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

随意详细说明问题。

答案 3 :(得分:1)

不要使用Login控件,这会让它变得更难。

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);
}
相关问题