当我在某个URL上询问用户HTTP Basic Auth时,浏览器仅为此页面和其他一些URL发送Authorization
标题。
用PHP编写的Testcase脚本: http://testauth.veadev.tk/
有三个要求提供凭据的网址(您可以随意使用)。 注销链接(在浏览器身份验证表单中按“取消”按钮后删除当前凭据,在IE中不起作用)。 指向根URL的链接和一些测试更深层次的URL。
问题:
如果在Authorization
发送了/
,为什么浏览器不会在HTTP/1.0 401 Unauthorized
网址上发送/system/dev
标头?
要重复:打开清除http://testauth.veadev.tk/,点击Auth2
,输入任何凭据,之后您将被转发到/
。您会看到Auth: null
,表示浏览器未发送凭据标头。
如果Authorization
发送/
,为什么浏览器会在HTTP/1.0 401 Unauthorized
处发送/dev
标头?
要重复:打开清除http://testauth.veadev.tk/,点击Auth1
,输入任何凭据,之后您将被转发到/
。您会看到Auth: string 'Basic dHQ6dHQ=' (length=14)
之类的内容,这意味着浏览器会发送凭据标头。
如果您重复第一个案例,然后点击Auth1
,您将拥有Root
和所有其他页面的凭据。为什么呢?
如果您点击Auth3
(/some/deep/and/long/url
),您将获得Page3
(/some/deep/and/long/3
)的凭据,而不是其他地方。为什么呢?
要清除测试之间的凭据状态,请重新启动浏览器或点击“{1}}”,然后点击“身份验证”表单Logout
,然后Cancel
返回(Firefox,Google Chrome)。
发送Root
标题的规则是什么?
答案 0 :(得分:1)
RFC 2617,第2节声明:
客户应该假设所有路径都在或深于 Request-URI的路径字段中的最后一个符号元素也是 在Basic领域值指定的保护空间内 当前的挑战。客户可以抢先发送 相应的授权标头,其中包含资源请求 空间没有从服务器接收到另一个挑战。
如果您正在使用摘要挑战,则第3.2节规定您可以在domain
标题中指定WWW-Authenticate
以指示保护空间将是什么。我会尝试将其设置为类似domain=/
的内容。我不确定这是否适用于基本授权,但尝试它不会有害;如果没有,摘要授权使用起来并不困难,并且更加安全。