ajax请求需要401授权,但重试成功

时间:2011-11-28 09:43:24

标签: php apache ntlm squid

我们在服务器上使用apache和NTLM:

NTLMAuth on
AuthType NTLM
AuthName "Auth"
NTLMAuthHelper "/usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp"
NTLMBasicAuthoritative on
require valid-user

当我们使用ajax时,这给出了一个错误,我们的大多数ajax请求在第一次尝试时失败并显示消息“401 Authorization Required”但是在自动重试时它们成功了,为什么两个请求之间存在差异?

我们的应用程序正常运行,但此错误很烦人,使用资源并减慢应用程序。

1 个答案:

答案 0 :(得分:1)

我怀疑你实际看到的不是某种“自动重试”行为,而是challenge-response authentication of NTLM。就其性质而言,您必须为连接上的第一个请求添加额外的往返。身份验证如下所示:

  1. 客户端请求受NTLM身份验证保护的资源。
  2. 服务器将回复401未经授权的人,并指出它支持的机制(在本例中为NTLM)。
  3. 客户端使用初始NTLM身份验证消息(“类型1”消息)请求资源,该消息包含用户的域和用户名以及客户端的功能。
  4. 服务器响应401未授权和NTLM质询(“类型2”消息)。
  5. 客户端计算对服务器质询的响应,然后使用最终的NTLM身份验证消息(“类型3”消息)请求资源。
  6. 服务器使用适当的代码进行响应 - 如果身份验证未成功,则为401,如果身份验证成功,则会成功,找不到,等等。
  7. 所以是的,您将使用一些额外的资源来执行NTLM身份验证(无论如何都使用基本身份验证。)但是,请注意,NTLM验证连接而不是请求。因此,通过相同的保持活动的HTTP连接的后续请求不需要重新进行身份验证。这减轻了挑战 - 反应性质的负担。

    最后,请注意,大多数支持NTLM或SPNEGO的Web浏览器都是为此准备的,并将使用expect / continue。因此,他们不会在初始连接中发送POST数据(例如),直到他们通过身份验证并从服务器获得HTTP继续,这也应该减少burdern。