c# - 浏览器偶尔会在回发和重定向后丢失用于身份验证的 HttpCookie

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

一段时间以来,这一直是一个令人烦恼的问题,但非常零星且难以隔离。

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

我们的团队对我们所有的网站和 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 时在我们的开发服务器上发生了这种情况。我已经登录到应用程序,允许应用程序 session 超时,然后尝试再次登录。尝试的登录随后无法设置 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。然而,在渲染后的页面跟踪信息中,列出了多个.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) )

关于c# - 浏览器偶尔会在回发和重定向后丢失用于身份验证的 HttpCookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4557594/

相关文章:

c# - 如何在字符串中添加点

asp.net - SQL Server主-子关系而不是表中的存储过程

html - 我的浏览器不会根据我的 CSS 样式表更改网站

javascript - 使用 Javascript 将用户发送到他们浏览器的主页

java - 如何使用网络浏览器制作 P2P 流媒体?

c# - 在 Windows Media Center 中使用 keySend

c# - 温莎城堡拦截机

c# - UpdatePanel 不会阻止按钮重新加载页面

asp.net - Visual Studio 性能编码 UI - 弹出窗口损坏,因为 Web 测试记录器导致它在完整窗口中打开

c# - 删除对局部变量 c# 的无用赋值