我遇到了这个问题,这是网络上唯一提到的。在摘要访问身份验证中,发生的事件顺序是。
- 在 /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 会将其视为虚拟位置,请求将正常通过。因为我可以访问服务器的代码,所以我能够做到这一点。
希望对您有所帮助。
问候,
萨提亚·西杜