摘要身份验证在 IE8、Firefox 和 Chrome 上不起作用

Posted

技术标签:

【中文标题】摘要身份验证在 IE8、Firefox 和 Chrome 上不起作用【英文标题】:Digest authentication not working on IE8, Firefox and Chrome are fine 【发布时间】:2010-02-03 14:58:07 【问题描述】:

我有一个需要摘要认证的网站,当我用 IE8 浏览它时,即使密码正确,它也会给我 401。 Firefox 和 Chrome 可以正常工作。我用 Fiddler 检查了授权标头,一切似乎都很好。你能给我一些关于这个问题的提示吗?

附言另外,我在 C# 中实现摘要身份验证时也遇到了同样的问题,我不知道这两者是否相关。

【问题讨论】:

这是服务器标头。服务器:Apache/2.2.13 (FreeBSD) mod_ssl/2.2.14 OpenSSL/0.9.8e DAV/2 mod_wsgi/2.8 Python/2.5.4 php/5.2.12 with Suhosin-Patch 【参考方案1】:

我遇到了这个问题,这是网络上唯一提到的。在摘要访问身份验证中,发生的事件顺序是。

    在 /url 上获取 401 带有 WWW-Authenticate 标头 这会在您的浏览器上弹出登录对话框。输入凭据后。 GET /url 以及 Authorization 标头。 200 OK(如果一切顺利)。

这适用于 Firefox 和 Chrome,但不适用于 IE8。

我的意思是,如果我在服务器上的虚拟位置执行 GET,它会起作用,但是当我对静态文件执行 GET 时它不起作用。在静态文件的情况下,我一次又一次地被提示登录。

使用嗅探器后,我发现在请求虚拟位置的情况下,事件发生的顺序如上所述,但是当我请求静态文件时,顺序如下:

    在 /url 上获取 401 带有 WWW-Authenticate 标头 这会在您的浏览器上弹出登录对话框。输入凭据后。 获取 /url(没有授权标头) 401 未经授权。

基本上当它是一个静态文件时,它使用用户名和密码,但从未在授权标头中发送它。服务器未收到此标头以 401 响应,再次提示登录。

要让 IE8 正常工作,你必须欺骗它,认为这不是一个静态文件,而是一个虚拟位置。对我来说,这很容易,因为我可以访问服务器的源代码。如果您无法访问它,我真的不知道该怎么做。

如果您已请求虚拟位置。 1. 获取 /virtual_location 2. 带有 WWW-Authenticate 标头的 401,看起来像

WWW-Authenticate: Digest realm="validusers@robapi.abb", domain="127.0.0.1:80", qop="auth", nonce="9001cd8a528157344c6373810637d030", opaque="", algorithm="MD5" , stale="FALSE"

注意 opapue 参数是一个空字符串。

另一方面,如果您请求静态文件 1. 获取 /staticfile.txt 2. 带有 WWW-Authenticate 标头的 401,看起来像

WWW-Authenticate: Digest realm="validusers@robapi.abb", domain="127.0.0.1:80", qop="auth", nonce="81bd1ca10ed6314570b7362484f0fd31", opaque="0-1c5-4f7f4c1e",算法=“MD5”,陈旧=“假”

这里的 opaque 参数是一个非空字符串。

因此,如果您确保 opaque 参数始终为空字符串,IE8 会将其视为虚拟位置,请求将正常通过。因为我可以访问服务器的代码,所以我能够做到这一点。

希望对您有所帮助。

问候, 萨提亚·西杜

【讨论】:

【参考方案2】:

我遇到了同样的问题。就我而言,我需要对我的整个站点进行摘要身份验证,使用“”或“”中的指令。无论哪种方式都适用于 Mac、PC 和 ios 上的 Firefox 和 Safari。不幸的是,IE8 似乎在这方面遇到了麻烦。在尝试了其他一些更改后,我终于发现如果我只需要对子目录(例如“”)进行身份验证,并将我的内容移动到受保护的目录中,IE8 就开始工作了。我来回走了几次,只改变了这个属性,以确认这是关键的区别。

顺便提一下,tcpdump 显示 IE8 甚至没有尝试发送摘要式身份验证。它显示了身份验证对话框,获取了我的用户名和密码,然后发送了一个没有身份验证信息的普通 GET 请求。

您是否(曾经)保护整个内容树?

我不确定为什么 IE8(并且只有 IE8)关心这种区别,但这就是我发现的。

在寻找问题的解决方案时,您的问题是唯一似乎相关的提及,我在网上找不到任何答案。这让我相信要么没有人尝试以这种方式配置 Digest 身份验证,要么大多数人只是放弃并使用 Firefox(或其他一些非 MS 浏览器)

【讨论】:

【参考方案3】:

哇,我肯定遇到了同样的问题。我有两个虚拟主机,都使用摘要身份验证。在一个站点上,我试图保护整个站点(即 ),它适用于我尝试过的所有浏览器除了 IE8。在另一个站点上,我只保护了一个子目录,这在 IE8 中运行良好。

【讨论】:

【参考方案4】:

我遇到了同样的问题,并尝试对整个虚拟主机使用摘要身份验证。但是下面的配置在 IE 上不起作用。

<Location />
    AuthType Digest
    AuthName "Login"
    AuthDigestDomain /
    AuthUserFile /path/to/.htdigest
    Require valid-user
</Location>

http://lists.centos.org/pipermail/centos/2013-January/131225.html 中的解决方法效果很好:

ErrorDocument 401 "some random text"

更好的解决方案是排除通常位于 /error/.* 的 apache 错误页面

e.g.
Alias /error/ "/usr/share/apache2/error/"

以下配置对我来说效果很好(另见https://bz.apache.org/bugzilla/show_bug.cgi?id=10932#c5):

<LocationMatch "^/(?!error/)">
    AuthType Digest
    AuthName "Login"
    AuthDigestDomain /
    AuthUserFile /path/to/.htdigest
    Require valid-user
</LocationMatch>

【讨论】:

以上是关于摘要身份验证在 IE8、Firefox 和 Chrome 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

ADFS 身份验证 - IE8 有效,Chrome 失败

HTTPS 和摘要式身份验证

与 IIS、Firefox 和 SQL Server 集成的 Windows 身份验证

摘要和基本身份验证有啥区别?

为啥在 Django 中需要基本或摘要式身份验证?

自定义摘要身份验证