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

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

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

我找到的两个解决方案是

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

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

【问题讨论】:

标签: asp.net session cookies


【解决方案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 中加入了一个加密票证并应用静态加密方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 2013-07-18
    • 2023-03-27
    • 2011-05-07
    • 2011-11-30
    • 1970-01-01
    • 2016-06-02
    相关资源
    最近更新 更多