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

时间:2020-03-05 18:59:36  来源:igfitidea点击:

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

  • Web服务器确定尽管请求中包含格式正确的Authorization标头,但标头中的凭据未成功进行身份验证。
  • Web服务器返回401状态代码,并包括一个或者多个列出受支持的身份验证类型的WWW-Authenticate标头。
  • 浏览器检测到对我对XMLHttpRequest对象的调用的响应是401,并且该响应包含WWW-Authenticate标头。然后,它会弹出一个身份验证对话框,再次询问用户名和密码。

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

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

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

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

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

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

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

解决方案

回答

我们使用哪种服务器技术?是否有用于身份验证的特定产品?

由于浏览器仅在执行其工作,因此我相信我们必须在服务器端进行更改,以不返回401状态代码。可以使用自定义身份验证表单来完成此操作,该表单在身份验证失败时会再次返回该表单。

回答

我认为这是不可能的-如果我们使用浏览器的HTTP客户端实现,它将始终弹出该对话框。我想到了两个技巧:

  • 也许Flash对此的处理方式有所不同(我还没有尝试过),所以让Flash电影发出请求可能会有所帮助。
  • 我们可以在自己的服务器上为要访问的服务设置一个"代理",并对其进行一些修改,以使浏览器无法识别它们。

回答

在Mozilla中,创建XMLHttpRequest对象时,可以使用以下脚本来实现它:

xmlHttp=new XMLHttpRequest();
xmlHttp.mozBackgroundRequest = true;
xmlHttp.open("GET",URL,true,USERNAME,PASSWORD);
xmlHttp.send(null);

第二行防止出现对话框。

回答

在Mozilla领域中,将XMLHttpRequest(docs)的mozBackgroundRequest参数设置为true会禁止显示这些对话框,并导致请求失败。但是,我不知道跨浏览器的支持程度如何(包括这些失败请求上的错误信息的质量在所有浏览器中是否都很好)。