我有任何有趣的问题让我完全难过。
我构建了一段生产代码,它读取由另一个部门管理的机器设置的 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 和 Internet 上的其他地方提到。这些都不适用。我已经阅读了 Eric Law 关于 cookie 内部的 IEInternals 文章——http: //blogs.msdn.com/ieinternals/archive/2009/08/20/WinINET-IE-Cookie-Internals-FAQ.aspx
IE 中没有启用时髦的插件。只需 Flash、Silverlight、Live ID 登录助手和 Fiddler2。
没有用于过滤特定于我的域的内容的 InPrivate 规则。
由于我使用的是笔记本电脑,因此我尝试了家庭网络中的 IE8(重新启动后)以排除 DNS 问题。我在家里遇到了同样的行为,所以据我所知,时髦的 DNS 不是问题。
我已经多次浏览了所有的 IE 设置,以为我可能错过了一个不起眼的 cookie 设置。隐私设置为“中”,没有特殊处理的网站。
使用开发工具,我确保未选中“始终从服务器刷新”。
我不认为这是我可以向 Microsoft 报告的任何事情,因为我无法在其他任何地方重现该问题。
所以在这一点上,我不知所措。没有在 IE8 中打开某种我不知道的诊断模式,或者没有对其进行调试的代码......我已经没有好主意了。
我在想我遇到了错误,某些注册表设置或类似设置已被调整,或者某处已损坏。
有任何想法吗?