Chrome 66下向NTLM认证服务器发起API请求遇问题求助
Chrome 66下NTLM认证API请求的问题解决
嘿,我之前也碰到过Chrome 66升级后和NTLM认证相关的Fetch请求坑,给你捋捋可能的原因和具体的请求头调整方案,应该能解决你的问题:
可能的原因分析
- 安全机制收紧:Chrome 66对跨域凭证(credentials)的处理逻辑做了更新,NTLM作为依赖连接的认证机制,隐式的请求配置很容易触发浏览器的安全拦截,导致异常跳转至API页面认证。
- 认证上下文混乱:新版本Chrome对NTLM认证的请求上下文要求更严格,如果在页面未完全初始化时发起请求,会导致认证完成后页面状态异常(空白、键盘失效)。
- 缓存干扰:浏览器缓存的旧认证状态或请求结果,会让第一次请求的认证流程出错,刷新后缓存失效才恢复正常。
针对性的请求头调整方案
你可以在Fetch请求中添加几个关键的请求头和配置,来适配Chrome 66的新规则:
<html> <head> <script type="text/javascript"> document.addEventListener('DOMContentLoaded', function() { fetch('https://fakeapiurl.com/api', { credentials: 'include', mode: 'cors', headers: { 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Connection': 'keep-alive', 'Accept': 'application/json' } }) .then(function(response) { return response.json(); }) .then(function(myJson) { console.log(myJson); }) .catch(function(err) { console.error('请求出错:', err); }); }); </script> </head> <body> </body> </html>
配置说明
mode: 'cors':强制浏览器按照CORS规范处理请求,明确告知浏览器要传递凭证,避免Chrome 66的隐式安全拦截触发异常跳转。Cache-Control: no-cache+Pragma: no-cache:彻底禁用请求缓存,避免旧的认证状态干扰第一次请求的流程,解决刷新前的空白页面问题。Connection: keep-alive:维持与服务器的连接,NTLM是基于连接的认证机制,保持连接可以减少重复的认证协商,避免跳转。Accept: application/json:明确告诉服务器期望JSON响应,防止服务器返回认证跳转的HTML内容导致页面解析异常。- 放在
DOMContentLoaded事件中:确保页面完全初始化后再发起请求,避免认证流程和页面初始化冲突导致的状态异常(键盘失效、空白页)。
额外验证点
如果调整后还是有问题,可以临时禁用Chrome的内置广告拦截(设置→隐私和安全→网站设置→广告)测试,虽然概率不高,但Chrome 66的广告拦截规则可能误判NTLM认证请求为恶意请求。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

