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

Php 401 ajax请求需要授权,但重试成功,php,apache,ntlm,squid,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 Require

我们在服务器上使用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”,但在自动重试时成功了,为什么两个请求之间存在差异


我们的应用程序可以正常工作,但这个错误很烦人,占用了资源,降低了应用程序的速度。

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

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

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