IE8没有适当地跨域应用cookie - 仅在一台机器上

Eth*_*own 6 cookies internet-explorer setcookie internet-explorer-8

我有任何有趣的问题,让我完全难过.

我有一段我构建的生产代码,它读取由另一个部门管理的机器设置的IBM LTPA令牌cookie,对其进行验证,并使用它来登录我的团队管理的系统(通过设置一些特殊的cookie).这个单点登录过程对最终用户完全透明,并且在所有浏览器中已经在生产中运行了好几年.

最近,我注意到它在我的IE8开发机器上无法正常工作.我最近从Vista升级到Windows 7.但是我不确定在升级之前或之后这是不是在我的机器上工作,因为它已经工作了很长时间,我没有理由对它进行测试.同一台机器上的FireFox 3.5和Chrome 4 dev都按预期工作.在这台机器上的XP SP3虚拟IE6工作正常.家中多台机器上的IE8工作正常(Windows Server 2008和Windows 7).

出于诊断目的,我清除了我的开发IE8(WinInet缓存)中的所有缓存数据,以一个干净的平板开始.我向Fiddler开火,追查过程并确定哪些不起作用.我发现的相当有趣,我无法解释.

在初始站点登录后 - 让我们将其命名为ltpa.domain.com,会话cookie将按预期使用Set-Cookie标头从服务器下推.我验证域已正确设置为.domain.com并且路径为/.登录后来自浏览器的所有后续请求将所有cookie按预期推送回服务器并返回每个请求.事实上,这是一个门户网站,还有一些额外的内容,也就是说,portal.domain.com也可以检索; 所有cookie也正确传递给该服务器.

现在有趣的是 - 当我向myserver.domain.com发出请求时 - 由ltpa.domain.com设置的域级别cookie不会被推送到myserver.domain.com,即使它们应该是. 如果缺少cookie,则单点登录进程会自动重定向回ltpa.domain.com(并将cookie推送到ltpa登录进程用于重定向的客户端) - myserver设置的域级别cookie未被推送回到ltpa.domain.com.

同样,这只发生在我所知道的我的开发机器上的这个IE8实例上.这个过程每天使用数千次,用户群相当大,我们没有收到最终用户的其他投诉 - 因此没有迹象表明这是IE8或类似的系统性问题.

在我看来,它将myserver.domain.com和ltpa.domain.com视为单独的域,即使它们不是.

有两点可能值得一提 - 但可能是红色鲱鱼,因为它一直都是这样,并且从未引起过任何问题.

  • DNS在这里有点时髦.LTPA.domain.com解析为外部IP.但是,myserver.domain.com解析为内部IP.对该IP进行反向查找会给出内部dns名称 - 比方说myserver.internal.domain.com.我推测可能IE8正在进行某种反向查找以防止基于DNS的攻击 - 因此我修改了我的HOSTS文件并将myserver.domain.com指向外部IP以进行测试.我在Fiddler中证实了请求转到了外部IP - 但它与cookie没有任何区别.他们仍然没有通过.

  • 以前,myserver.domain.com位于IE WinInet安全配置页面中的"可信站点"下.我删除了它和那里的另一个网站.我们叫这台机器,my2.domain.com; 巧合地(或许不是?)这台机器也没有通过ltpa.domain.com设置的域cookie.在这种情况下,我不需要传递cookie,但我还是测试了它,看看这个问题是否影响了其他机器.在IE状态栏中,ltpa.domain.com,portal.domain.com和myserver.domain.com都显示在"Internet"区域下.有点奇怪的是,my2.domain.com仍然在状态栏中显示"可信站点",即使它没有在对话框中列出?是的,我在进行更改后重新启动.

其他注意事项.

  • 我知道IE和非.com域的其他问题,引用的cookie值和其他cookie异常 - 在stackoverflow和Interwebs上的其他地方提到过.这些都不适用.我已经阅读了Eric Law的关于cookie内部的IEInternals文章 - http://blogs.msdn.com/ieinternals/archive/2009/08/20/WinINET-IE-Cookie-Internals-FAQ.aspx

  • 在IE中没有启用时髦的插件.Just Flash,Silverlight,Live ID登录助手和Fiddler2.

  • 没有用于过滤特定于我的域的内容的InPrivate规则.

  • 由于我在笔记本电脑上,我从家庭网络(重启后)尝试过IE8以排除DNS问题.我在家里遇到了同样的行为,所以就我所知,时髦的DNS并不是问题.

  • 我已多次浏览所有IE设置,认为我可能错过了一个模糊的cookie设置.隐私设置为"中等",没有特殊处理的网站.

  • 使用开发工具,我确保未选中"始终从服务器刷新".

  • 我不认为这是我可以向微软报告的任何内容,因为我无法在其他任何地方重现这个问题.

所以在这一点上,我很茫然.没有在IE8中打开我不知道的某种诊断模式,或者没有用于调试的代码......我已经没有好主意了.

我想我已经遇到过一个bug,一些注册表设置或类似的东西已被调整,或某些东西,某处已经腐败.

有任何想法吗?

Eth*_*own 3

我想我已经在这里找到了这个问题。

这一定是IE的一个bug。好吧,如果我们要吹毛求疵的话,实际上是两个。

尽管我很早就从 IE 安全对话框中的受信任站点列表中删除了 myserver.domain.com 和 my2.domain.com,但这些站点仍然保留在注册表中的区域配置中!我通过在注册表中搜索我的服务器名称来解决这个问题,瞧,一点侦探工作被证明是富有成效的。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains 下有一个子项

对于 .com 域

在domain.com下,我从“受信任的站点”列表对话框中删除了两个不同服务器的两个子项——两者的REG_DWORD值*都设置为2。这当然意味着,将该站点放入“受信任的站点”中。

我从“脚本专家”那里找到了一篇旧文章,讨论了这个特定的键以及可用于更改区域的值。 http://blogs.technet.com/heyscriptingguy/archive/2005/05/02/how-can-i-add-a-site-to-internet-explorer-s-restricted-sites-zone.aspx

也许这些设置在 UI 中已以某种方式被弃用,但仍然可以读取/使用?我不知道,但显然用户界面中显示的内容与实际使用的内容不匹配。

此外,正如之前的评论中提到的,当点击 myserver.domain.com 的根目录时(顺便说一句,这导致来自服务器的 403),状态栏显示“Internet | Internet”。保护模式:关闭”这只会增加混乱,因为它应该读作“受信任的站点|” 保护模式:关闭'。

所以解决方案最终是

a - 删除上面指定的注册表项,以便将所有内容移至 Internet 区域或 b - 将 *.domain.com 添加到受信任站点列表中,以便将所有内容移至 Internet 区域

希望您能向 IE 团队 Eric 提交这些问题吗?

感谢您为我指明了正确的方向!