我们发现 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(使用前将#替换为@)