摘要身份验证在 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】:我遇到了同样的问题。就我而言,我需要对我的整个站点进行摘要身份验证,使用“
顺便提一下,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 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章