我正在使用ASP身份验证和集成的Web服务。
用户在登录页面上使用Forms身份验证登录 要注销,我从Silverlight调用身份验证Web服务并调用logout。
一切正常,但现在有时IE会变得疯狂,不会再退出用户了。
我使用了Fiddler,事实证明身份验证服务返回一个SetCookie来清除ASPXAUTH cookie但在下一次调用时IE仍然设置了cookie。
所以当然因为cookie在那里用户经过身份验证并重新登录而不是被定向到登录页面。
我查了一下,没有看到任何其他问题的描述。 我无法重现它,我的同事有一个行为不端的IE,它在一个环境中工作正常,而不是另一个环境(一个有DEV的问题,另一个有PreProd服务器的问题)。
知道可能会发生什么吗?
答案 0 :(得分:4)
我有这个问题,为了确保用户退出,现在我使用以下代码:
FormsAuthentication.SignOut();
// Drop all the information held in the session
Session.Clear();
Session.Abandon();
// clear authentication cookie
HttpCookie cookie1 = new HttpCookie(FormsAuthentication.FormsCookieName, "");
cookie1.Expires = DateTime.Now.AddYears(-1);
Response.Cookies.Add(cookie1);
// clear session cookie
HttpCookie cookie2 = new HttpCookie("ASP.NET_SessionId", "");
cookie2.Expires = DateTime.Now.AddYears(-1);
Response.Cookies.Add(cookie2);
// Redirect the user to the login page
Response.Redirect("YourLoginPage.aspx", true);
答案 1 :(得分:2)
为了避免这个问题,当您进行SignOut时,下一次调用必须使用Redirect(pageLogOut, true );并停止任何其他活动,直到完全重定向。参数true非常重要。
在您调用SignOut()之后,您必须强制浏览器刷新cookie数据,因为如果身份验证因任何原因再次请求cookie,那么cookie将获得更长的生存时间并且不会将其从浏览器中删除请使用SigntOut命令。
因此,在SignOut之后,重定向到页面 - 或者确保将cookie刷新到浏览器,并且不再询问任何与用户身份验证有关的内容,直到cookie完全写入浏览器
希望得到这个帮助。
答案 2 :(得分:0)
您遇到的问题可能与Cookie域有关。 Cookie可能会写入"." + FormsAuthentication.CookieDomain
。我已将Cookie设置为" admin.example.com"之前的域名,并且已经看到了.
前面的cookie。在开发环境中,它被写入localhost
我使用的解决方案是为每个身份验证cookie和会话cookie添加两个cookie。
所以我使用的解决方案如下:
protected void SignOut(HttpContext Context)
{
FormsAuthentication.SignOut();
Context.Session.Abandon();
// clear authentication cookie
Context.Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName)
{
Path = FormsAuthentication.FormsCookiePath,
Value = "",
Domain = (Convert.ToString(FormsAuthentication.CookieDomain).Length > 0) ? Convert.ToString(FormsAuthentication.CookieDomain) : Context.Request.Url.Host,
HttpOnly = true,
Expires = DateTime.Now.AddYears(-1)
});
Context.Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName)
{
Path = FormsAuthentication.FormsCookiePath,
Value = "",
Domain = (Convert.ToString(FormsAuthentication.CookieDomain).Length > 0) ? "." + Convert.ToString(FormsAuthentication.CookieDomain) : "." + Context.Request.Url.Host,
HttpOnly = true,
Expires = DateTime.Now.AddYears(-1)
});
// clear session cookie (not necessary for the current problem but recommended anyway)
Context.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId")
{
Path = FormsAuthentication.FormsCookiePath,
Value = "",
Domain = (Convert.ToString(FormsAuthentication.CookieDomain).Length > 0) ? Convert.ToString(FormsAuthentication.CookieDomain) : Context.Request.Url.Host,
HttpOnly = true,
Expires = DateTime.Now.AddYears(-1)
});
Context.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId")
{
Path = FormsAuthentication.FormsCookiePath,
Value = "",
Domain = (Convert.ToString(FormsAuthentication.CookieDomain).Length > 0) ? "." + Convert.ToString(FormsAuthentication.CookieDomain) : "." + Context.Request.Url.Host,
HttpOnly = true,
Expires = DateTime.Now.AddYears(-1)
});
FormsAuthentication.RedirectToLoginPage();
}
此调用的结果会将以下标头添加到响应中
地点:/Login.aspx RETURNURL = Default.aspx的
设置Cookie:**** =; expires = Tue,12-Oct-1999 05:00:00 GMT;路径= /;仅Http
设置Cookie:**** =;域= admin.example.com;到期= 2014年4月23日星期三18:04:58 GMT;路径= /;仅Http
设置Cookie:**** =;域= .admin.example.com;到期= 2014年4月23日星期三18:04:58 GMT;路径= /;仅Http
设置Cookie:ASP.NET_SessionId =; domain = admin.example.com expires = Wed,23-Apr-2014 18:04:58 GMT;路径= /;仅Http
设置Cookie:ASP.NET_SessionId =; domain = .admin.example.com expires = Wed,23-Apr-2014 18:04:58 GMT;路径= /;仅Http
其中***
是包含我的加密身份验证票证值的Cookie的名称;
请注意,第一个Set-Cookie
可能是通过FormsAuthentication.SignOut()
方法调用生成的。