Chrome 64中Ajax请求触发401认证错误(IIS基础认证场景)
问题原因及解决方案
嘿,这个问题确实和Chrome 64的变更有关!我来给你捋清楚前因后果和解决办法:
为什么Chrome 64会出现这个问题?
Chrome 64版本对Basic Authentication在XMLHttpRequest(也就是你说的Ajax请求)中的处理逻辑做了调整:当会话中的认证凭证无法正常传递时,它不再像旧版(63及以下)或者其他浏览器那样自动复用现有会话的认证信息,反而会在请求URL里拼接上null:null@这种无效的认证前缀,导致IIS无法识别合法的认证信息,直接返回401错误。而Safari、Firefox和Chrome 63及更早版本,会正确复用当前已通过认证的会话凭证,不会生成这种无效URL,所以功能正常。
可行的解决办法
- 给Ajax请求添加
withCredentials属性:这是最直接的方案,告诉浏览器在请求中携带当前会话的认证信息。
原生XMLHttpRequest示例:
jQuery Ajax示例:var xhr = new XMLHttpRequest(); xhr.open('GET', '你的请求地址', true); xhr.withCredentials = true; // 关键设置 xhr.send();$.ajax({ url: '你的请求地址', type: 'GET', xhrFields: { withCredentials: true // 关键设置 }, success: function(data) { // 处理返回结果 } }); - 检查IIS的Basic认证配置:确保站点已经正确开启Basic认证,并且没有和匿名访问的规则冲突;同时确认应用程序池的运行账号拥有访问站点资源的权限,避免凭证传递过程中丢失。
- 手动添加Authorization请求头:如果上面的方法无效,可以尝试在请求头里手动构造认证信息(注意安全,不要明文暴露账号密码),格式如下:
不过这种方式建议配合后端会话管理使用,避免前端存储敏感信息。xhr.setRequestHeader('Authorization', 'Basic ' + btoa('用户名:密码'));
内容的提问来源于stack exchange,提问作者BrotherShamus
相关产品推荐
相关产品推荐

