我该如何禁止浏览器的验证对话框?
我的Web应用程序有一个登录页面,通过AJAX调用提交身份验证凭证。 如果用户输入正确的用户名和密码,则一切正常,但如果不是,则会发生以下情况:
直到第3步,这一切都很好。我不想弹出对话框,我想要在我的AJAX回调函数中处理401响应。 (例如,通过在登录页面显示错误消息。)我希望用户重新输入他们的用户名和密码,当然,但我希望他们看到我友好,令人放心的登录表单,而不是浏览器的丑陋,默认认证对话框。
顺便说一下,我无法控制服务器,因此让它返回一个自定义状态代码(即,除401之外的其他内容)不是一种选择。
有什么办法可以抑制身份验证对话框吗? 特别是,我能否在Firefox 2或更高版本中禁用“需要身份验证”对话框? 有没有办法在IE 6及更高版本中禁止连接到[主机]对话框?
编辑
来自作者的更多信息(9月18日):
我应该补充说,浏览器的身份验证对话框弹出的真正问题是它给用户提供的信息不足。
用户刚刚通过登录页面上的表单输入了用户名和密码,他认为他已经正确输入了他们的名称,并且他点击了提交按钮或回车。 他的期望是他会被带到下一页,或者被告知他错误地输入了他的信息,应该再试一次。 但是,他却出现了一个意外的对话框。
该对话不会确认他刚输入用户名和密码的事实。 它没有明确说明存在问题,他应该再试一次。 相反,对话框会向用户显示隐藏的信息,如“该网站说:'[realm]'。” 在哪里[领域]是一个只有程序员才能喜欢的简短领域名称。
网页浏览器设计师注意到:如果对话框本身只是更加用户友好,没有人会问如何取消认证对话框。 我做登录表单的全部原因是我们的产品管理团队正确地认为浏览器的认证对话框很糟糕。
我不认为这是可能的 - 如果你使用浏览器的HTTP客户端实现,它会一直弹出该对话框。 想起两个黑客:
也许Flash处理方式不同(我还没有尝试过),因此使用Flash电影制作请求可能会有所帮助。
您可以为您在自己的服务器上访问的服务设置'proxie',并让它稍微修改身份验证标头,以便浏览器不会识别它们。
我在这里遇到了同样的问题,我公司的后台工程师实现了一种显然被认为是好习惯的行为:当对URL的调用返回401时,如果客户端设置了头X-Requested-With: XMLHttpRequest
,服务器在响应中删除www-authenticate
标头。
副作用是不显示默认身份验证弹出窗口。
确保您的API调用将X-Requested-With
头设置为XMLHttpRequest
。 如果是这样,除了根据这个良好的做法改变服务器的行为外,没有什么可做的。
满足以下两个条件时,浏览器弹出登录提示符:
WWW-Authenticate
标题出现在响应中 如果您可以控制HTTP响应,那么您可以从响应中删除WWW-Authenticate
标头,并且浏览器不会弹出登录对话框。
如果您无法控制响应,则可以设置一个代理来从响应中筛选出WWW-Authenticate
标头。
据我所知(如果我错了,随时纠正我),一旦浏览器收到WWW-Authenticate
标头,就无法阻止登录提示。
上一篇: How can I suppress the browser's authentication dialog?
下一篇: How to do authorization in an authentication microservice?