IE 在使用 NTLM 身份验证时随机发送空 POST 正文(使用 Angular 到 Spring)

2023-12-02

我们发现 IE 11 中看似随机的调用缺少 POST。经过进一步检查,来自浏览器的请求包含 NTLM 协商令牌。我们有时也会在 GET 上看到此令牌,但它们不受主体问题的影响,因为它们没有主体问题。 Chrome和FF没有这个问题。

进一步的调查表明,如果我们的会话超时并且浏览器被重新验证,那么我们将在大约 1 - 2 分钟的时间间隔内持续看到此问题。据我了解,如果 IE“期望”401,那么它不会包含 POST 正文,因为它期望再次发生 NTLM 握手。

我们有一个 Angular 应用程序(目前混合了 Angular 1 和 2,但在此之前出现在 1 中)。 Angular 应用程序对我们的 Spring boot 应用程序进行静态 Web 服务调用。我们使用 waffle 进行 NTLM 身份验证

// Shiro-Waffle / Security
'com.github.dblock.waffle:waffle-parent:1.7.3',
'com.github.dblock.waffle:waffle-shiro:1.7.3',
'org.apache.shiro:shiro-core:1.2.3',
'org.apache.shiro:shiro-web:1.2.3',

https://blogs.msdn.microsoft.com/ieinternals/2010/11/21/challenge-response-authentication-and-zero-length-posts/

我有一个蹩脚的解决方法,我将在下面发布作为答案,但我根本不喜欢它。


好的,我找到了一个注册表破解方法。基本上,IE 会主动发送 NTLM 凭据,而无需从服务器发出 401。发送“预身份验证”时,IE 将省略 POST 正文(如果请求是 POST。)如果会话已经有效并且服务器已获得您的授权,则它会在没有正文的情况下允许请求通过,并会导致错误服务器(假设您的 POST 需要正文。)

所以正常的 NTLM 协商看起来像

  • 来自客户端的请求(带有 POST 正文)-> 服务器返回 401 www-验证:协商,www-验证:NTLM
  • 客户端发送 带有 NTLM 令牌的附加请求(无帖子正文)-> 服务器返回 401 NTLM代币
  • 客户端通过会话发送第三个请求(带有 POST 正文),服务器返回 200

通过这个优化

  • 客户端期望 401 并发送 NTLM 令牌(无正文)-> 服务器返回 401 和服务器令牌
  • 客户端发送第二个带有会话的请求(带有正文)-> 服务器返回 200

出现问题

  • 客户端期望 401 并发送 NTLM 令牌(无正文)-> 服务器处理请求并收到内部错误(可能是 500)

要添加的注册表项会阻止这种“优化”

HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Internet Settings/ 
Add the following registry value: 
Value Name: DisableNTLMPreAuth
Data Type: REG_DWORD
Value: 1

或者将这些条目保存到计算机上的 .reg 文件中,然后双击它

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\]
"DisableNTLMPreauth"=dword:00000001

我不确定为什么 IE 认为它必须重新验证,但从广泛的测试来看,一旦 IE 会话超时或会话无效并且它从服务器返回 401,它就会每隔 1 重新验证一次之后-2分钟。这可能与您在身份验证时所在的 URL 有关,因为您可能不在根目录下。我提供的第一个链接详细介绍了 IE 对 URL 的挑剔,以及它如何根据路径猜测哪些内容应该授权,哪些内容不应该授权。

相关文章:

零长度帖子

NTLM 预授权

NTLM 预授权

NTLM 预授权 jcifs

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IE 在使用 NTLM 身份验证时随机发送空 POST 正文(使用 Angular 到 Spring) 的相关文章

随机推荐