FormsAuthentication.SignOut不使用自定义域Cookie

RPM*_*984 9 asp.net cookies dns asp.net-mvc forms-authentication

标题应该说明一切.

这是设置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);
Run Code Online (Sandbox Code Playgroud)

这是我登出我的网站的代码:

FormsAuthentication.SignOut();
Run Code Online (Sandbox Code Playgroud)

环境:

  • 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并将到期时间设置为昨天.没有骰子.

这是怎么回事?有人可以帮忙吗?

vcs*_*nes 4

我相信,如果您将web.config 中domain元素的属性设置forms为与自定义 cookie 中的属性相同,它应该可以工作。(编辑:该方法不起作用,因为 FormsAuthentication 上的 SignOut 方法在 cookie 上设置了您不是的其他标志,例如HttpOnly)该SignOut方法基本上只是将 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);
}
Run Code Online (Sandbox Code Playgroud)

身份验证 cookie 只是一个普通的 cookie;因此您可以像删除任何其他 cookie 一样删除它:使其过期并使其无效