如何使用 JQuery AJAX 防止 Firefox 提示使用 HTTP Basic Auth 输入用户名/密码?

Posted

技术标签:

【中文标题】如何使用 JQuery AJAX 防止 Firefox 提示使用 HTTP Basic Auth 输入用户名/密码?【英文标题】:How do I keep Firefox from prompting for username/password with HTTP Basic Auth with JQuery AJAX? 【发布时间】:2010-10-30 01:21:05 【问题描述】:

我正在编写一些浏览器端动态功能并使用 HTTP Basic Auth 来保护一些资源。用户体验非常重要,而且是高度定制的。

这是一个简单的测试 JQuery 方法,最终将测试用户是否在表单中提供了正确的凭据:

$(document).ready(function() 
    $("#submit").click(function() 
    var token = Base64.encode($('#username').val() + ':' + $('#password').val());        
    $.ajax(
      url: '/private',
      method: 'GET',
      async: false,
      beforeSend: function(req) 
        req.setRequestHeader('Authorization', 'test:password');
      ,
      error: function(request, textStatus, error) 
        if (request.status == 401) 
          alert('401');
        
      
    );
    return false;
  );
);

如果不允许他们访问/private,此时他们应该只会看到警告框。但是,在 Firefox 上,会弹出浏览器提供的登录表单(使用新凭据重试)。 Safari 不这样做。

我们希望完全控制自定义表单、淡入淡出、过渡等的体验。我怎样才能不显示 Firefox 的默认框? (如果这在我们测试 IE 时会成为一个问题,我也很想听听那里的解决方案。)

【问题讨论】:

注意***.com/questions/928967/… 的后续行动。 【参考方案1】:

解决方案是将WWW-Authenticate 标头设置为Basic 以外的其他值。例如将其设置为:

WWW-Authenticate: None

WWW-Authenticate: FormBased

如果您使用基于表单的登录。然后浏览器不会显示登录窗口。

【讨论】:

如相关问题的答案评论中所示。 WWW-Authenticate 应该表示一个(或多个)有效质询。我也认为None 不是真的。 ***.com/questions/1748374/… 请在此处查找有关如何使用 Java 和 Spring Security 解决此问题的解决方案:***.com/questions/19079687/… 这是 解决方案,尽管看起来不规则。 ietf.org/rfc/rfc2617.txt (4.6) 指定了多个方案,但不限于 Basic、Digest 等。因此取决于客户端(浏览器)是否支持方案,如果不支持方案,则浏览器不进行用户交互。我使用这种方法从 Windows SSO (SPNEGO) 透明回退到简单的表单登录。顺便说一句:通过主机名访问服务器时,只能在 Chrome+IE 中可靠地工作;不要使用 IP。 @comeGetSome 我不知道你是如何获得透明后备的,所以我通过创建一个 API 端点“testGSS”来“修复它”,它试图从客户端评估尽可能多的参数(哪个网络,哪个浏览器等...)以及当协商身份验证很有可能起作用时,会发送肯定的答复。然后,Web 应用程序尝试协商身份验证,当成功时,在 localStorage 中存储一个标志。下次当 Web 应用程序看到此标志时,它会立即转到 Negotiate auth 端点,所有其他情况都转到基于表单的方法。【参考方案2】:

如果您还没有阅读:

How can I supress the browser's authentication dialog?

看起来不太有希望:)

【讨论】:

【参考方案3】:

不幸的是,我在这里遇到了同样的问题。

在我看来,浏览器不应该提示 xmlhttprequest。我真的希望有人会推动这一点,因为人们真的很想迁移到 jQuery 来满足他们的身份验证需求。

这里是我可以给你的帮助,我发现了这个 jQuery Digest 的东西,我不知道它到底做了什么或什么,但如果有人能以正确的方式使用这段代码,我们可以有一个 jquery digest auth system .

https://www.openhub.net/p/digestj

我想通过这个方便的新 AuthDigestDomain 选项,我们可以重写上述脚本或其他任何东西,并将安全区域“链接”在一起,我们可以一劳永逸地解决这个问题。嗯...祝你好运=)

【讨论】:

【参考方案4】:

我在某处发现了此身份验证弹出问题的解决方法。

WWW-Authenticate: None

对我不起作用,但我已经添加了

'Authorization': 'Basic'

到标题,它就像一个魅力。

【讨论】:

以上是关于如何使用 JQuery AJAX 防止 Firefox 提示使用 HTTP Basic Auth 输入用户名/密码?的主要内容,如果未能解决你的问题,请参考以下文章

使用 jquery select2 插件时,如果已列出 ajax 调用中的有效值,如何防止选择新标签?

等待ajax响应时如何防止用户交互?

Jquery 防止Ajax重复提交权威解决方案

如何防止 PHP PDO 通过 jQuery AJAX 插入 MySQL varchar 中的转义字符

jQuery ajax:如何防止 chrome DevTools 中的 404 错误垃圾邮件? [复制]

防止未处理的 jQuery AJAX 错误 [重复]