我在网站上遇到了一些非常奇怪的cookie问题。它是一个ASP.NET网站,使用Umbraco 6.1.6作为其CMS,但主要是自定义代码,并使用表单身份验证进行用户登录。它在IIS Server 2012 R2上运行。
成功注册后,用户凭据将传递给login方法,该方法设置如下cookie:
var authTicket = new FormsAuthenticationTicket(realUsername, false, 60);
string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket)
{
HttpOnly = true,
Secure = FormsAuthentication.RequireSSL,
Path = FormsAuthentication.FormsCookiePath,
Domain = FormsAuthentication.CookieDomain,
Expires = authTicket.Expiration
};
HttpContext.Current.Response.Cookies.Set(cookie);
然后进行重定向,尝试在注册之前前往用户之前在网站上的任何位置。
return Redirect(redirectUrl);
在重定向的页面中,它会检查请求cookie以查看用户是否已登录:
HttpCookie authCookie = HttpContext.Current.Request.Cookies.Get(FormsAuthentication.FormsCookieName);
有时候,authCookie包含会话数据,并且可以长时间运行.....有时候它是空的 - 在相同的时间段内 - 所以它只是间歇性地工作。
这让我相信,IIS可能无法在重定向上检查请求cookie - 因为cookie还没有到达用户的浏览器。但各种文档和其他SO帖子告诉我,当我使用ResponseRedirect类型重定向时,这应该有效。
奇怪的是,当我刚刚注册但服务器认为我没有登录时,我可以查看Chrome开发工具中“未登录”页面的cookie,这是真的 - 没有设置cookie - 但是,当您从“未登录”页面点击该站点的“登录”按钮...这会强制它检查用户是否再次登录,这次“authCookie”包含cookie数据。 Chrome之后告诉我,当我提交页面时,这些数据不存在!然后,当返回“登录”页面时,cookie会重新出现在开发工具中。
此时,我不知道是不是我不相信Chrome开发工具,或者是有一些奇怪的浏览器缓存/ IIS缓存正在进行,或者是什么。我尝试查找cookie /重定向问题,他们似乎只提出了更新版本的IE。
我尝试关闭浏览器,关闭视觉工作室,这似乎没有直接影响。
最后一点信息 - 我在这里的一篇文章中读到,当在一个线程上执行注册/登录但是在另一个线程上执行注册后的代码时,有时会出现问题。我检查了线程调试器,发现确实注册/登录正在不同的线程上执行......但是当它工作时就会观察到。
最令人沮丧的部分是当它突然开始工作几个小时 - 而且似乎没有什么可以做的就是再次打破它以尝试不同的事情。 (这就是我现在的位置!我想至少在不同的浏览器中尝试...)