1

更改机器密钥后如何删除 ASP.NET 中的 cookie 但留在同一个子域上?

目前我们在 example.domain.com 上有 cookie,但我们需要移动到通配符 cookie (.domain.com) 以便 cookie 也适用于 foo.domain.com。为此,我们手动设置了一个机器密钥来加密/解密 asp.net 登录 cookie。问题是已经拥有旧 cookie 的人现在在尝试访问该站点时会收到 CryptographicException(因为它出于某种原因试图解密旧 cookie)。我们更改了 cookie 的名称,但它没有帮助 - 仍然收到错误。所以我们发现我们想删除所有旧的 cookie。我们尝试使用以下代码在登录站点上执行此操作:

var myCookies = Request.Cookies.AllKeys;
foreach (var cookieName in myCookies)
{
    var cookie = Request.Cookies[cookieName];
    if (cookie == null) continue;
    cookie.Value = "written " + DateTime.Now;
    cookie.Expires = DateTime.Now.AddYears(-1);
    cookie.Domain = "example.domain.com"
    Response.Cookies.Add(cookie);
}

我们到达了代码,它运行了,但是在谷歌浏览器资源中检查时 cookie 仍然存在。所以显然删除没有奏效。我们尝试了几种不同的方法(添加路径 =“/”,将 cookie.Value 设置为 cookie.Value 等。出于某种奇怪的原因,cookie 仍然存在,我们无法删除它们。

所以回到最初的问题,我们如何在 ASP.NET MVC 4.5 中删除 cookie 在我们的 cookie 上更改为通配符域并明确说明 web.config 中的机器密钥?

4

2 回答 2

1

如果您并非绝对必须使用相同的票证名称,那么如果您更改了 FormsAuthentication cookie 的名称,您的解决方案应该可以工作:

<forms name=".YOUR_NEW_COOKIE_NAME" /> **

** 请注意,我已从显示的标签中省略了其他属性,因此您不想逐字复制/粘贴它。

于 2015-07-07T01:53:20.650 回答
1

事实证明,通过删除 cookie.Domain,它设法删除了 cookie。我认为这与这样一个事实有关,即为了覆盖 cookie,您在添加替换 cookie 时需要尽可能具体。鉴于之前的 cookie 是在没有指定domain 或 path的情况下添加的,这是最具体的。

最终在这种情况下工作的代码是:

var myCookies = Request.Cookies.AllKeys;
foreach (var cookieName in myCookies)
{
    var cookie = Request.Cookies[cookieName];
    if (cookie == null) continue;
    cookie.Value = "written " + DateTime.Now;
    cookie.Expires = DateTime.Now.AddYears(-1);
    Response.Cookies.Add(cookie);
}
于 2015-07-07T22:02:38.160 回答