如何隐藏浏览器的身份验证对话框?

我的Web应用程序有一个登录页面,该页面通过AJAX调用提交身份验证凭据。如果用户输入正确的用户名和密码,则一切正常,但如果不正确,则会发生以下情况:

  1. Web服务器确定尽管请求中包含格式正确的Authorization标头,但标头中的凭据未成功进行身份验证。

  2. Web服务器返回401状态代码,并包括一个或多个列出受支持的身份验证类型的WWW-Authenticate标头。

  3. 浏览器检测到对我对XMLHttpRequest对象的调用的响应是401,并且该响应包括WWW-Authenticate标头。然后,它会弹出一个身份验证对话框,再次询问用户名和密码。

直到步骤3为止,一切都很好。我不想弹出对话框,我想处理AJAX回调函数中的401响应。(例如,通过在登录页面上显示错误消息。)当然,我希望用户重新输入用户名和密码,但是我希望他们看到我友好的,令人放心的登录表单,而不是浏览器的丑陋默认设置身份验证对话框。

顺便说一句,我无法控制服务器,因此让它返回自定义状态代码(即401以外的其他内容)不是一种选择。

有什么办法可以禁止身份验证对话框?特别是,我可以在Firefox 2或更高版本中取消“需要身份验证”对话框吗?有什么方法可以禁止IE 6及更高版本中的“连接到[主机]”对话框?


编辑
作者提供的其他信息(9月18日):
我应该补充一点,弹出的浏览器身份验证对话框的真正问题在于,它无法为用户提供足够的信息。

用户刚刚通过登录页面上的表单输入了用户名和密码,他认为自己已经正确键入了二者,并且单击了提交按钮或按Enter。他的期望是他将被带到下一页,或者被告知他输入的信息不正确,应重试。但是,相反,他看到一个意外的对话框。

对话是没有的,他只是一个事实确认没有输入用户名和密码。它没有明确指出存在问题,他应该再试一次。而是,对话框为用户提供了诸如“网站说:' [领域] '”之类的神秘信息。其中[realm]是只有程序员才能喜欢的简短领域名称。

Web浏览器设计师注意到:如果对话框本身只是更易于使用,则没人会问如何隐藏身份验证对话框。我填写登录表单的全部原因是,我们的产品管理团队正确地认为浏览器的身份验证对话框很糟糕。


米琪卡哇伊
浏览 676回答 3
3回答

烙印99

我在这里遇到了相同的问题,并且我公司的后端工程师实施了一种行为,这显然是一种好习惯:当对URL的调用返回401时,如果客户端设置了标头X-Requested-With: XMLHttpRequest,则服务器将www-authenticate标头丢弃在响应。副作用是默认身份验证弹出窗口不会出现。确保您的API调用的X-Requested-With标头设置为XMLHttpRequest。如果是这样,除了按照此良好做法更改服务器行为外,没有任何其他事情可做。

犯罪嫌疑人X

同时满足以下两个条件时,浏览器会弹出登录提示:HTTP状态为4xxWWW-Authenticate 标头出现在响应中如果可以控制HTTP响应,则可以WWW-Authenticate从响应中删除标头,并且浏览器不会弹出登录对话框。如果您无法控制响应,则可以设置代理以WWW-Authenticate从响应中过滤出标头。据我所知(如果我错了,请随时纠正我),一旦浏览器收到WWW-Authenticate标头,就无法阻止登录提示。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript