一段时间以来,这一直是一个令人讨厌的问题,但非常零星,难以孤立。
有时,在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不存在。
还有其他人有过这方面的经验吗?这是一个令人讨厌的问题,如此零星,但我希望能够解决它。我担心的是它可能会影响用户,因为对问题的描述如此复杂,我们就不会知道。
答案 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;
}
}