【问题标题】:FormsAuthentication.SignOut Not Working With Custom-Domain CookieFormsAuthentication.SignOut 不适用于自定义域 Cookie
【发布时间】:2011-12-09 18:11:16
【问题描述】:

标题应该说明一切。

这是设置 cookie 的代码:

// snip - some other code to create custom ticket
var httpCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encodedTicket);
httpCookie.Domain = "mysite.com";
httpContextBase.Response.Cookies.Add(httpCookie);

这是我退出网站的代码:

FormsAuthentication.SignOut();

环境

  • ASP.NET MVC 3 Web 应用程序

  • IIS Express

  • Visual Studio 2010

  • 自定义域:“http://localhost.www.mysite.com”

所以当我尝试注销时,cookie 仍然存在。如果我去掉 httpCookie.Domain 行(例如默认为 null),它工作正常。

我注意到的其他奇怪的事情是,当我设置域时,Chrome 不会在开发者工具的资源部分显示我的 cookie,但是当我设置域时,它会显示。

其次,当我实际使用自定义域创建 cookie 时,在下一个请求中,当我从请求中读取 cookie(对其进行解密)时,cookie 在那里,但域为空?

我还尝试创建另一个具有相同名称的 cookie 并将到期时间设置为昨天。没有骰子。

发生了什么事?有人可以帮忙吗?

【问题讨论】:

  • 您是否可以在 web.config 中的 forms 元素上指定 domain 属性? SignOut 方法将使用它来设置正确的 cookie。
  • @vcsjones - 是的,我不能。因为我的应用程序提供单独的 TLD,例如 www.mysite.comsomeothersite.foo.com。所以我需要从请求中动态提取域。我会暂时尝试一下,看看是否可以解决它。 (尽管这不是一个解决方案,但只是出于好奇)
  • 不将 HTTP Only 用于身份验证令牌是极其危险的。
  • @Chris - 是的,我现在已经做到了 httponly。

标签: asp.net asp.net-mvc cookies dns forms-authentication


【解决方案1】:

我相信,如果您将 web.config 中 forms 元素上的 domain 属性设置为与自定义 cookie 中的相同,它应该可以工作。 (编辑:该方法行不通,因为 FormsAuthentication 上的 SignOut 方法在 cookie 上设置了您不是的其他标志,例如 HttpOnlySignOut 方法基本上只是设置 cookie 的到期日期到 1999 年,它需要域来设置正确的 cookie。

如果您无法对域进行硬编码,您可以推出自己的注销方法:

private static void SignOut()
{
    var myCookie = new HttpCookie(FormsAuthentication.FormsCookieName);
    myCookie.Domain = "mysite.com";
    myCookie.Expires = DateTime.Now.AddDays(-1d);
    HttpContext.Current.Response.Cookies.Add(myCookie);
}

身份验证 cookie 只是一个普通的 cookie;所以你可以像删除任何其他 cookie 一样删除它:expire it and make it invalid

【讨论】:

  • @RPM1984 奇怪,我能够使用主机文件将自定义域伪装成测试站点来完成这项工作。我会继续挖掘。
  • 成功了!诺斯!我想当我尝试做同样的事情时(就像我的问题一样,我忘了设置域.../slaps head)
【解决方案2】:

我遇到了类似的问题。在我的例子中,我将一些 userData 存储在 AuthCookie 中并体验到与上述相同的效果,并且在每次请求的身份验证时,读取 cookie 并将 userData 放入静态变量中。在我的情况下,数据被保存在应用程序中。为了解决这个问题,我必须先清除我的静态变量,然后让 cookie 过期。我在 AccountController 的 LogOff 方法中使用了以下内容:

AuthCookie.Clear(); //STATIC CLASS holding my userdata implemented by me.
Response.Cookies[FormsAuthentication.FormsCookieName].Expires = DateTime.Now.AddYears(-1);
Response.Cookies[FormsAuthentication.FormsCookieName].Value = null;
return RedirectToAction("Index", "Home");

希望这会有所帮助。

更新

提交后的预感,我将中间两行替换为:

FormsAuthentication.SignOut();

...它在以前没有的地方工作得很好。

注意:

AuthCookie.Clear();

... 没有触及 AuthCookie,它只是将我写的静态类重置为默认值。

再次,希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2021-10-02
    • 2020-01-16
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多