浏览器偶尔会在回发和重定向后失去HttpCookie进行身份验证

时间:2010-12-29 20:29:41

标签: c# asp.net browser forms-authentication httpcookie

一段时间以来,这一直是一个令人讨厌的问题,但非常零星,难以孤立。

有时,在Web应用程序上进行过身份验证的浏览器已经打开了一段时间,多次登录和退出同一个Web应用程序,有多个标签,几乎都是任何浏览器(Chrome,IE ,Firefox,Safari),并且看似随机,在设置并随后进行重定向后,失去了保留AuthCookie的能力。关闭浏览器并启动新会话可解决此问题,打开其他浏览器并尝试进行身份验证也是如此。

我们的团队对所有网站和网络应用程序使用表单身份验证。这是一个非常典型的设置,其中显示登录表单,用户输入凭据并在回发的单击事件上设置cookie,然后重定向到同一页面,然后引用cookie并用于完成身份验证。

在这种情况下

FormsAuthentication.FormsCookieName = ".WebAuth"

在活动中:

    FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, Username, DateTime.Now, DateTime.Now.AddMinutes(SessionTimeout), false, Username);
    HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(authTicket));
    Response.Cookies.Add(faCookie);
Response.Redirect(Request.RawUrl, true);

重定向后,在PreInit上:

HttpCookie authCookie = Request.Cookies[cookieName];

此时,authCookie变量通常不为空,但在我上面概述的这些孤立的情况下,cookie在重定向后返回null。

这种情况非常随机发生,有时会影响我们的一位开发人员。正如我所说,重新启动浏览器可以解决问题。

今天我在使用Chrome时在我们的开发服务器上实现了它。我已登录到应用程序,允许应用程序进行会话超时,然后再次尝试登录。尝试登录然后无法设置cookie。我将Visual Studio远程连接到服务器上的进程以开始调试。我可以逐步完成代码,甚至将新代码版本部署到服务器并进行更新,重新启动应用程序,重新启动服务器上的IIS,附加并重新连接到项目,并且问题仍然存在于Chrome中。在Firefox中,我能够毫无问题地进行身份验证。

从Chrome中,登录将验证,尝试设置如上所述的响应Cookie。在重定向之前,我可以看到正确设置的响应Cookie,以及请求Cookie中的对应Cookie。但是,在看似成功登录后的每次重定向上,响应和请求Cookie都消失了。

我在应用程序上启用了Trace以查看cookie集合:

请求Cookie集合中有.WebAuth,以及ASP.NET_SessionId和几个ASPSESSIONIDxxxxxxxx,但是当页面加载时,Request.Cookies范围内只有ASP.NET_SessionId和ASPSESSIONIDxxxxxxxx cookie可用,没有.WebAuth。但是,在渲染后的页面跟踪信息中,列出了多个.WebAuth cookie,只是该页面似乎无法访问它们。

首先,在身份验证后的工作版本上,页面的跟踪信息中都有.WebAuth响应和请求Cookie。但是在无效的浏览器窗口中,响应Cookie不存在。

还有其他人有过这方面的经验吗?这是一个令人讨厌的问题,如此零星,但我希望能够解决它。我担心的是它可能会影响用户,因为对问题的描述如此复杂,我们就不会知道。

3 个答案:

答案 0 :(得分:1)

根据您的方案,您可能会遇到浏览器对每个域/总数的Cookie数量的限制。限制相对较高,但存在(规范:http://www.ietf.org/rfc/rfc2109.txt,第6.3节,最近的一些信息 - http://www.nczonline.net/blog/2008/05/17/browser-cookie-restrictions/

如果再次发生这种情况,请尝试查看实际的服务器响应(即使用Fiddler),以查看是否将cookie发送到浏览器。检查为域和当前页面设置的cookie(取决于浏览器有不同的方法,在所有浏览器中,您可以通过在地址栏中运行以下内容来查看一些cookie javascript :alert(document.cookie)

答案 1 :(得分:1)

这是一个非持久性cookie问题。会议只是超时。

尝试在此行中将false更改为true

FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, Username, DateTime.Now, DateTime.Now.AddMinutes(SessionTimeout), true, Username);

同时添加

faCookie.Expires = DateTime.Now.AddMinutes(SessionTimeout);

答案 2 :(得分:0)

我陷入了类似的境地,事情确实如你所描述的那样。但是,后来找到了原因。

ASP.NET和IIS将MyApplication和myapplication理解为相同,但浏览器将它们视为不同。因此,当我们为/ MyApplication设置auth cookie时,当我们转到/ myapplication时,它们不会被发送到服务器。

下一步是修复:

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        string url = HttpContext.Current.Request.Url.PathAndQuery;
        string application = HttpContext.Current.Request.ApplicationPath;

        if (!url.StartsWith(application))
        {
            HttpContext.Current.Response.Redirect(application + url.Substring(application.Length));
            Response.End();
            return;
        }
    }