浏览器没有在深层网址上设置`Authorization`标头设置为根网址

时间:2014-04-02 08:46:38

标签: http http-basic-authentication

当我在某个URL上询问用户HTTP Basic Auth时,浏览器仅为此页面和其他一些URL发送Authorization标题。

用PHP编写的Testcase脚本: http://testauth.veadev.tk/

有三个要求提供凭据的网址(您可以随意使用)。 注销链接(在浏览器身份验证表单中按“取消”按钮后删除当前凭据,在IE中不起作用)。 指向根URL的链接和一些测试更深层次的URL。

问题:

  1. 如果在Authorization发送了/,为什么浏览器不会在HTTP/1.0 401 Unauthorized网址上发送/system/dev标头? 要重复:打开清除http://testauth.veadev.tk/,点击Auth2,输入任何凭据,之后您将被转发到/。您会看到Auth: null,表示浏览器未发送凭据标头。

  2. 如果Authorization发送/,为什么浏览器会在HTTP/1.0 401 Unauthorized处发送/dev标头? 要重复:打开清除http://testauth.veadev.tk/,点击Auth1,输入任何凭据,之后您将被转发到/。您会看到Auth: string 'Basic dHQ6dHQ=' (length=14)之类的内容,这意味着浏览器会发送凭据标头。

  3. 如果您重复第一个案例,然后点击Auth1,您将拥有Root和所有其他页面的凭据。为什么呢?

  4. 如果您点击Auth3/some/deep/and/long/url),您将获得Page3/some/deep/and/long/3)的凭据,而不是其他地方。为什么呢?

  5. 要清除测试之间的凭据状态,请重新启动浏览器或点击“{1}}”,然后点击“身份验证”表单Logout,然后Cancel返回(Firefox,Google Chrome)。

    发送Root标题的规则是什么?

1 个答案:

答案 0 :(得分:1)

RFC 2617,第2节声明:

  

客户应该假设所有路径都在或深于   Request-URI的路径字段中的最后一个符号元素也是   在Basic领域值指定的保护空间内   当前的挑战。客户可以抢先发送   相应的授权标头,其中包含资源请求   空间没有从服务器接收到另一个挑战。

如果您正在使用摘要挑战,则第3.2节规定您可以在domain标题中指定WWW-Authenticate以指示保护空间将是什么。我会尝试将其设置为类似domain=/的内容。我不确定这是否适用于基本授权,但尝试它不会有害;如果没有,摘要授权使用起来并不困难,并且更加安全。