如何在更改为手动机器密钥和通配符 cookie 后删除旧 cookie ASP.NET MVC 4.5

How to delete old cookies after changing to manual machine key and wildcard cookies ASP.NET MVC 4.5

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

目前我们在 example.domain.com 上有 cookie,但我们需要转移到通配符 cookie (.domain.com),以便该 cookie 也适用于 foo.domain.com。为此,我们手动将机器密钥设置为 encrypt/decrypt 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);
}

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

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

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

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

** 请注意,我已从显示的标签中省略了其他属性,因此您不希望逐字 copy/paste 它。

事实证明,通过删除 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);
}