一段时间以来,这一直是一个令人烦恼的问题,但非常零星且难以隔离。
有时,浏览器在 Web 应用程序上进行了身份验证,已经打开了一段时间,多次登录和退出同一个 Web 应用程序,有多个选项卡,几乎是任何浏览器(Chrome、IE、Firefox、 Safari),并且似乎是随机的,在设置并跟随重定向后失去了保留 AuthCookie 的能力。关闭浏览器并启动新会话可以解决问题,打开不同的浏览器并尝试进行身份验证也是如此。
我们的团队对我们所有的网站和 Web 应用程序使用表单身份验证。这是一个非常典型的设置,其中显示登录表单,用户输入凭据并在回发的单击事件上设置 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 变量通常不为 null,但在我上面概述的这些孤立情况下,cookie 在重定向后返回 null。
这非常随机发生,有时会在影响我们的一位开发人员之前几周。正如我所说,重新启动浏览器可以解决问题。
今天我在使用 Chrome 时在我们的开发服务器上发生了这种情况。我已登录应用程序,允许应用程序会话超时,然后再次尝试登录。然后尝试登录未能设置 cookie。我将 Visual Studio 远程连接到服务器上的进程以开始调试。在整个过程中,我可以单步执行我的代码,甚至将新的代码版本部署到带有更新的服务器,重新启动应用程序,重新启动服务器上的 IIS,附加并重新附加到项目,问题仍然存在于 Chrome 中。在 Firefox 中,我能够毫无问题地进行身份验证。
在 Chrome 中,登录将验证,并尝试设置如上所述的响应 Cookie。在重定向之前,我可以看到正确设置的响应 Cookie,以及请求 Cookie 中的对应项。但是,在看似成功登录后的每次重定向中,响应和请求 Cookie 都消失了。
我在应用程序上启用了 Trace 以查看 cookie 集合:
Request Cookies Collection中有一个.WebAuth,还有ASP.NET_SessionId和几个ASPSESSIONIDxxxxxxxx,但是页面加载时,Request.Cookies范围内只有ASP.NET_SessionId和ASPSESSIONIDxxxxxxxx cookie可用,没有.WebAuth的迹象. 但是,在页面渲染后的 Trace 信息中,列出了多个 .WebAuth cookie,只是页面似乎无法访问它们。
首先,在身份验证后的工作版本上,页面的跟踪信息中同时存在 .WebAuth 响应和请求 Cookie。但在无法正常工作的浏览器窗口中,响应 Cookie 不存在。
有没有其他人有过这方面的经验?这是一个令人烦恼的问题,而且是零星的,但我希望能够解决它。我担心它可能会影响用户,我们不会知道,因为问题的描述是如此复杂。