【问题标题】:IE/IIS integrated authentication problemIE/IIS集成认证问题
【发布时间】:2009-10-10 11:02:27
【问题描述】:

在 IIS 中我有:

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

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

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

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

如果我将 Windows 身份验证添加到 IIS 中的 myapplication 中,一切似乎都可以在任何浏览器上正常工作。

为什么会这样? IE 中的错误还是我遗漏了什么?

【问题讨论】:

    标签: iis forms-authentication internet-explorer windows-authentication


    【解决方案1】:

    这是 IE 中的一个错误,也是基于 HTTP 的 NTLM/协商(又名集成)身份验证设计中的一个错误。

    NTLM/Negotiate 是面向连接的身份验证协议,HTTP 并不是真正为它设计的。因此,当您在服务器上的一个页面需要这种身份验证机制时,IE 通常会假定服务器上的其他页面具有相同的要求。

    此外,出于性能和安全原因,如果 IE 期望对给定的 POST 请求进行 Negotiate/NTLM 质询,那么它将首先发送一个 0 字节的 POST,期望服务器返回一个 HTTP/ 401 质询,它将对其进行身份验证,然后正确发送 POST 正文。

    但是,在您的情况下,不需要集成身份验证的文件夹获取 0 字节 POST 并说“Hrm,奇怪,一个 0 字节的帖子。好的,HTTP/200,这里的页面就像您使用过的一样获取。”

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

    (由于 HTTP 连接重用的工作原理,Fiddler 可能会让您有些困惑)。

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

    【讨论】:

    • 谢谢 Eric,有什么办法可以解决这个问题? IE 应该像 Firefox 一样发送整个 POST 消息,对吗?我猜 IE 8 可以工作,还没有测试过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 2011-05-02
    相关资源
    最近更新 更多