IE 8和9不会在下一个请求中发送cookie。 它适用于Chrome 14和FF 6。
在我的情况下,我有一个ASP.NET 3.5 Web应用程序运行,使用Cookie进行身份validation。 如果cookie不存在,用户将被redirect到login页面。
基础设施如下。 父应用程序将我的ASP.NET页面embedded到iframe中。 ASP.NET应用程序不是直接针对的,而是通过负载平衡器。 在父页面和负载平衡器之间使用HTTPS连接。 负载平衡器它自己通过另一个IIS代理到实际的ASP.NET应用程序,但是这个连接是通过标准的HTTP进行的。 父应用程序和ASP.NET应用程序不在同一个域中运行。
该Cookie被标记为“仅限HTTP”。 杰夫·阿特伍德(Jeff Atwood)有一篇关于“仅限于HTTP”的好博客文章 ,但是仍然没有说,如果cookies也通过HTTP发送的话。
login到ASP.NET页面后,响应包含cookie和redirect。 当浏览器执行redirect时,请求中不包含cookie。 这就是为什么ASP.NET应用程序正在假设一个新的用户,并再次redirect到login页面。
所以我的问题在这里是我猜,为什么IE不发送cookie。 是否因为cookie被标记为“仅HTTP”? 如果是这样的话,任何人都可以告诉我如何禁用此ASP.NETfunction? 在论坛上说 ,你不能关掉这个。 但是我发现了一种笨重的禁用方式,如果可能的话,我想避免这种方式。
顺便说一句,它工作正常,如果我将ASP.NETurl添加到受信任的网站。 我需要以任何方式避免这些。
更新1:有趣的是,如果我通过位于ASP.NET页面之前的HTTPS直接访问负载均衡器,则Cookie将被正确发送到负载均衡器。 只有当站点位于父页面中的iframe中时(包含无效证书),cookies才会被发送。
更新2:为了说明这个场景,我添加了2张描述这个架构的图片。 第一个解释环境,第二个显示IFrame发出的两个请求的过程。 对第一个请求的响应包含2个cookie。 以下要求完全相同的应用程序不包括cookie。 如果我要么a)将负载均衡器(和最后的ASP.NET应用程序)添加到受信任的站点,或b)直接转到负载均衡器(和最后的ASP.NET应用程序)在浏览器中,而不是通过承载IFrame的父页面。 对不起,我很想添加图片,但我没有10个代表,所以Serverfault不允许我…
更新3:父页面和ASP.NET页面托pipe在不同的域上。 示例: – 父页面yourapp.com – 托pipe在iframe中的ASP.NET页面:myapp.com
事实certificate,IE不会通过HTTPS在跨域scheme中发送cookie。
为了解决我不得不添加一个自定义的P3P标题。 Scott Hanselman在这个话题上有一篇有趣的文章 。
在ASP.NET场景中,您可以通过IIS或您的应用程序在Global.asax中添加自定义标题。 这是对这个的解释。
这是因为cookie只被标记为HTTP。 IE假定只有HTTP的cookie只能被发送回它的来源。 它不认为HTTPS和HTTP源相同。 可以说,这是更合乎逻辑的 – 如果我通过一个安全的连接接收到一个只有HTTP的cookie,为什么我要通过一个不安全的连接发送它?
有一个解决方法 – 不要仅在HTTPS页面上设置Cookie HTTP。 相反,在redirect的HTTP页面上,再次设置cookie,但是这次只设置HTTP。 这应该可以解决问题。
(仅供参考,请仔细检查URL是否链接到完全相同的主机名。例如,不要将www.mydomain.comredirect到mydomain.com )。