【问题标题】:Removing a cookie and abandoning a session does not remove the cookie删除 cookie 并放弃会话不会删除 cookie
【发布时间】:2013-10-08 15:43:16
【问题描述】:

我在我的 C# WebForms 应用程序中创建了一个 cookie,我正在 Windows 7 64 位的 IE10 上对其进行测试。

问题是我无法从后面的代码中删除 cookie。如果我刷新页面或只是单击超链接返回到完全相同的页面,该页面仍然可以读取 cookie。

我有一个弹出控件,可以响应用户按下确定按钮:

String key = "mycookiedata";
HttpCookie oCookie = null;
if (null != HttpContext.Current.Request.Cookies[key])
{
    oCookie = HttpContext.Current.Request.Cookies[key];

    oCookie.Expires = DateTime.Now.AddDays(-1);
    HttpContext.Current.Response.Cookies.Set(oCookie);
}

Session.Remove(key);
Session.Abandon();
Session.Clear();

后面的代码完成,控制权返回给用户。一切似乎都很好,直到我刷新页面并发现我认为被删除的 cookie 没有。出于好奇,我还尝试关闭浏览器窗口并在新浏览器中重新加载页面,但 cookie 仍然存在。退出的用户应该对他们真正退出并且 cookie 消失感到自在。

我是否遗漏了代码中的某些内容?

【问题讨论】:

  • 您应该使用 Fiddler 并检查请求/响应。可能是在响应中删除了 cookie 时,可以在回发 (GET) 中重新创建它。另外,你是在做一个完整的回发还是只是一个 AJAX 更新?
  • cahmadzadeh,我不知道你的问题的答案。 OK 按钮处理是对 DevExpress 回调面板方法调用 cpdialog.PerformCallback() 的响应。那确实会回帖,但我不知道类型。我怀疑 Ajax 更新。我不认为我听说过 Fiddler,所以我一定会去看看。谢谢。
  • 我以为我看到了一条评论,但找不到关于我的会话调用是请求而不是响应的评论。那可能是。我尝试添加它作为摆脱cookie的想法。那没有用。值得一试。我将调查 cookie 的重新创建。可悲的是,我不能真正在 Visual Studio 中使用调试器,因为 cookie 在域而不是本地实体上工作,但我可以从 Visual Studio 获得流量。
  • 嗯,你必须做一个完整的回发(页面必须重新加载)否则cookie不会被实际设置(因此,它不会过期也不会被删除)。
  • cahmadzadeh,我将不得不联系 DevExpress 并了解我是否收到完整的回发。另一方面,我删除了我的临时 Session 调用,因为它没有做任何事情。

标签: c# asp.net cookies webforms httpcookie


【解决方案1】:
You cannot directly delete a cookie on a user's computer. 

但是,您可以通过以下方式指示用户的浏览器删除 cookie 将 cookie 的过期日期设置为过去的日期。

用户下次向域内的页面发出请求时,或 设置 cookie 的路径,浏览器将确定 cookie 已过期并将其删除。

检查这个Delete a Cookie from MSDN

你所能做的就是让cookie过期,通过设置过去的时间

下面的代码会做到这一点

if (Request.Cookies[key] != null)
{
    HttpCookie myCookie = new HttpCookie(key);
    myCookie.Expires = DateTime.Now.AddDays(-1d);
    Response.Cookies.Add(myCookie);
}

【讨论】:

  • @cahmadzadeh, You cannot directly delete a cookie on a user's computer 对于这个声明,我已经给出了参考,她所做的一切都是正确的。
  • 正如 Cahmadzadeh 所说,我确实以正确的方式删除了 cookie。会议电话只是大约半小时前添加的一个想法,并被立即删除。也就是说,Murali 给出的链接中的第二句话似乎很有趣。我想知道什么是“请求”。这是那句话,“下次用户向域或路径中设置 cookie 的页面发出请求时,浏览器将确定 cookie 已过期并将其删除。”
  • @SarahWeinberger,感谢您指出这句话。我添加了我的答案
  • 页面不会重新加载。 Cahmadzadeh 问有没有。取消具有 AutoPostBack="False",但我从 ok 按钮中删除了该属性,默认为 true,但仍然没有回发。
  • 在注销对话框关闭后添加 PerformPostBack() 调用,然后依次执行 Response.Redirect("/", false);打电话,不行。我仍然登录。令人沮丧。
【解决方案2】:

请求页面,如在第一个答案中没有工作。我尝试了几种变体和 nada。

我终于想出了答案。在 DevExpress 回调面板的 EndCallback JavaScript 事件中,我实现了对 JavaScript 函数 Delete_Cookie 的调用。让 JavaScript 删除 cookie 有效!

背后的代码有两个变化,其中一个或两个都可能是诀窍。

  1. 从客户端删除 cookie 而不是背后的 C# 代码。
  2. Delete_Cookie 代码设置的过期日期不是当前日期减一 (1),而是 1970 年的日期。我怀疑 1970 年的日期可以解决问题。

这是文章的link,我使用了它的 Delete_Cookie 代码。

【讨论】:

  • 请注意,如果出于安全目的必须删除此 cookie,那么在客户端执行此操作是一个巨大的漏洞(因为 JavaScript 代码很容易被禁用)。
猜你喜欢
  • 2013-09-12
  • 2012-05-23
  • 2012-08-12
  • 2016-06-17
  • 1970-01-01
  • 2020-04-27
  • 2010-11-08
  • 2022-01-03
相关资源
最近更新 更多