我正在尝试开发一个可以遍历 NTLM 身份验证代理的网络隧道。作为其中的一部分,我正在研究 NTLM 身份验证的工作原理。我的测试设置在一个 Windows 机器上配置了 WinGate 代理,需要 NTLM 身份验证。我的 Windows 客户端设置为使用 WinGate 机器作为代理。重新启动 WinGate 后,我打开的第一个网页需要身份验证 - 我看到通过 Fiddler 进行的 NTLM 交换。来自同一台 PC 的后续请求似乎不需要身份验证。我的意思是来自 PC 的任何请求 - 不仅仅是来自同一个浏览器 - 例如,在 Chrome 中完成初始身份验证后打开 Firefox。我使用 Fiddler(以前也使用过 Wireshark)捕获了所有流量 - 我没有看到任何令牌或标识被发送到代理的证据。那么代理如何知道允许这些后续请求通过?这是 NTLM 身份验证的预期行为吗?
答案1
我找到了答案 - WinGate 代理默认具有非标准行为 - 它根据客户端的 IP 地址缓存凭据。因此,一旦 NTLM 验证一次,来自 PC 的所有后续请求都会被验证。这可以通过在 WinGate 中创建凭据规则并选择“不允许其他会话使用会话建立的凭据”来覆盖
答案2
仅供参考。任何 NTLM 握手/身份验证都需要做大量工作。首先,通常需要发送 3 次请求才能完成握手(对于带有消息正文的 POST 来说,这是有问题的,IE 有一个可怕的黑客试图缓解这个问题,但实际上只会导致问题)。
因此,如果代理对每个连接进行身份验证,则需要处理 3 倍的请求,并且还必须通过 SSPI 将该身份验证流量传递到域控制器,因此域控制器上的负载也会高得多。然后 WinGate 必须从 AD 中检索对象,因此 AD DS 上的 LDAP 负载也会更高。
通过缓存凭证可以减少负载。当然,这是基于一个假设,即该 IP 上只有一个用户。如果这个假设无效,WinGate 有规则来覆盖此行为。