登录/注销时未清除ASP ASPXAUTH身份验证cookie

时间:2010-12-08 12:00:30

标签: asp.net internet-explorer authentication cookies

我正在使用ASP身份验证和集成的Web服务。

用户在登录页面上使用Forms身份验证登录 要注销,我从Silverlight调用身份验证Web服务并调用logout。

一切正常,但现在有时IE会变得疯狂,不会再退出用户了。

我使用了Fiddler,事实证明身份验证服务返回一个SetCookie来清除ASPXAUTH cookie但在下一次调用时IE仍然设置了cookie。
所以当然因为cookie在那里用户经过身份验证并重新登录而不是被定向到登录页面。

我查了一下,没有看到任何其他问题的描述。 我无法重现它,我的同事有一个行为不端的IE,它在一个环境中工作正常,而不是另一个环境(一个有DEV的问题,另一个有PreProd服务器的问题)。

知道可能会发生什么吗?

3 个答案:

答案 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()方法调用生成的。