我的Web应用程序有一个登录页面,通过AJAX调用提交身份验证凭据.如果用户输入正确的用户名和密码,一切都很好,但如果没有,则会发生以下情况:
Web服务器确定虽然请求包含格式良好的Authorization标头,但标头中的凭据无法成功进行身份验证.
Web服务器返回401状态代码,并包含一个或多个WWW-Authenticate标头,列出支持的身份验证类型.
浏览器检测到对XMLHttpRequest对象的调用的响应是401,响应包括WWW-Authenticate头.然后它会弹出一个身份验证对话框,再次询问用户名和密码.
这一切都很好,直到第3步.我不希望弹出对话框,我想要在我的AJAX回调函数中处理401响应.(例如,通过在登录页面上显示错误消息.)我希望用户重新输入他们的用户名和密码,当然,但我希望他们看到我友好,安心的登录表单,而不是浏览器的丑陋,默认验证对话框.
顺便说一句,我无法控制服务器,所以让它返回自定义状态代码(即401以外的东西)不是一个选项.
有什么办法可以抑制身份验证对话框吗?特别是,我可以在Firefox 2或更高版本中禁止"需要验证"对话框吗?有没有办法在IE 6及更高版本中禁止连接到[主机]对话框?
编辑
作者的其他信息(9月18日):
我应该补充说,浏览器的身份验证对话框弹出的真正问题是它给用户提供的信息不足.
用户刚刚通过登录页面上的表单输入了用户名和密码,他认为他已经正确输入了这些用户名和密码,并且他点击了提交按钮或按回车键.他的期望是,他将被带到下一页,或者可能被告知他输入的信息不正确,应该再试一次.但是,他会出现一个意外的对话框.
对话是没有的,他只是一个事实确认没有输入用户名和密码.它没有明确说明存在问题,他应该再试一次.相反,该对话框向用户显示诸如"网站说:' [领域] '之类的神秘信息." 凡[境界]是,只有一个程序员可以爱很短的领域名称.
Web broswer设计师注意到:如果对话框本身更加用户友好,没有人会问如何抑制身份验证对话框.我正在登录表单的全部原因是我们的产品管理团队正确地认为浏览器的身份验证对话框太糟糕了.
我在这里遇到了同样的问题,我公司的后端工程师实现了一种显然被认为是一种好习惯的行为:当对URL的调用返回401时,如果客户端设置了标题X-Requested-With: XMLHttpRequest
,则服务器会删除其中的www-authenticate
标题.响应.
副作用是不显示默认的身份验证弹出窗口.
确保您的API调用已将X-Requested-With
标头设置为XMLHttpRequest
.如果是这样,除了根据这种良好做法改变服务器行为之外没有任何事情要做......
我不认为这是可能的 - 如果您使用浏览器的HTTP客户端实现,它将始终弹出该对话框.想到两个黑客:
也许Flash以不同的方式处理(我还没有尝试过),所以有一个flash电影使请求可能会有所帮助.
您可以为您在自己的服务器上访问的服务设置"proxie",并让它稍微修改一下身份验证标头,以便浏览器无法识别它们.
满足以下两个条件时,浏览器会弹出登录提示:
HTTP状态为4xx
WWW-Authenticate
标头出现在响应中
如果您可以控制HTTP响应,则可以WWW-Authenticate
从响应中删除标头,浏览器不会弹出登录对话框.
如果无法控制响应,则可以设置代理以过滤WWW-Authenticate
响应中的标头.
据我所知(如果我错了,请随时纠正我),一旦浏览器收到WWW-Authenticate
标题,就无法阻止登录提示.
我意识到这个问题及其答案很古老.但是,我最终到了这里.也许其他人也会这样.
如果您有权访问返回401的Web服务的代码.只需更改服务以在此情况下返回403(禁止)而不是401.浏览器将不会提示输入凭据以响应403. 403是未经授权的特定资源的经过身份验证的用户的正确代码.这似乎是OP的情况.
从IETF关于403的文件:
接收不足以获得访问权限的有效凭据的服务器应该使用403(禁止)状态代码进行响应