IE/IIS集成身份验证问题

问题描述:

在IIS中我有:IE/IIS集成身份验证问题

http://myserver/myapplication
http://myserver/reports

报告应用程序是报告实际上它使用Windows身份验证服务。 myapplication是一个使用表单身份验证的asp.net应用程序。

服务器在公司域之外。如果我首先访问报告并输入用户名和密码(在服务器上创建的本地凭证),则系统会提示我可以访问报告页面,但没有问题。如果我直接进入我的应用程序的登录页面并尝试登录,则登录页面会刷新而无需执行任何操作。这总是发生在IE 6中。在IE 7中它会间歇性地发生。不会在Firefox中发生,或者如果Fiddler在后台运行,似乎可以即时解决问题。

我用wireshark查看发生了什么,并发现IE 6将从报告应用程序获取的Windows身份验证令牌发送到myapp。这是IE和Firefox之间的唯一区别。 IIS似乎吓坏了,只是将我的POST解释为登录页面作为GET并返回。

如果我添加Windows身份验证到IIS中的应用程序,一切似乎都适用于任何浏览器。

这是怎么发生的?在IE中的错误,或者我错过了什么?

这是一个在IE浏览器中的错误,并在通过HTTP的NTLM /协商(又名集成)身份验证设计中的错误。

NTLM /协商是面向连接的身份验证协议,HTTP并非真的为此设计。因此,当您的服务器上的一个页面需要此身份验证机制时,IE通常会假定服务器上的其他页面具有相同的要求。此外,出于性能和安全原因,如果IE 预期对给定POST请求的Negotiate/NTLM质询,则它将首先发送0字节POST,期望服务器返回HTTP/401质询它将进行身份验证,然后正确发送POST正文。

然而,在你的情况下,不需要集成认证的文件夹获得0字节的POST,并说“Hrm,很奇怪,一个0字节的文章好吧,HTTP/200,这里的网页,就像你会使用GET“。

因为IE永远不会收到它期望的401挑战,它实际上永远不会发送POST正文。

(由于HTTP连接重用的工作方式,提琴手可能会让你感到困惑)。

解决方法是确保如果您在主机上使用集成身份验证,请在任何地方使用它。

+0

谢谢埃里克,这是什么修复? IE应该像Firefox一样发送整个POST消息,对吧?我想IE 8的作品,还没有测试过。 – 2009-10-10 17:35:53