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

一段时间以来,这一直是一个棘手的问题,但非常零星,难以隔离.

有时候,在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变量通常不为空,但在上面概述的这些孤立的情况下,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不存在.

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

最佳答案 根据您的方案,您可能会遇到浏览器对每个域/总数的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))

点赞