我的 Web 应用程序有一个登录页面,该页面通过 AJAX 调用提交身份验证凭据。如果用户输入了正确的用户名和密码,一切都很好,但如果不是,则会发生以下情况:
- Web 服务器确定尽管请求包含格式正确的 Authorization 标头,但标头中的凭据未成功进行身份验证。
- Web 服务器返回一个 401 状态代码,并包含一个或多个 WWW-Authenticate 标头,其中列出了支持的身份验证类型。
- 浏览器检测到我对 XMLHttpRequest 对象的调用的响应是 401,并且响应包括 WWW-Authenticate 标头。然后它会弹出一个身份验证对话框,再次询问用户名和密码。
这一切都很好,直到第 3 步。我不想弹出对话框,我想在我的 AJAX 回调函数中处理 401 响应。(例如,通过在登录页面上显示错误消息。)当然,我希望用户重新输入他们的用户名和密码,但我希望他们看到我友好、令人放心的登录表单,而不是浏览器的丑陋默认身份验证对话框。
顺便说一句,我无法控制服务器,因此不能让它返回自定义状态代码(即 401 以外的代码)。
有什么办法可以抑制身份验证对话框?特别是,我可以在 Firefox 2 或更高版本中取消“需要身份验证”对话框吗?有什么方法可以抑制 IE 6 及更高版本中的 Connect to [host]对话框?
编辑
来自作者的附加信息(9 月 18 日):
我应该补充一点,弹出的浏览器身份验证对话框的真正问题是它向用户提供的信息不足。
用户刚刚通过登录页面上的表单输入了用户名和密码,他认为他已经正确输入了它们,并且他点击了提交按钮或回车。他的期望是他将被带到下一页,或者可能被告知他输入的信息有误,应该再试一次。然而,他却看到了一个意想不到的对话框。
该对话框不承认他刚刚输入了用户名和密码这一事实。它没有明确说明存在问题并且他应该再试一次。取而代之的是,对话框会向用户显示诸如“网站说:' [realm] '”之类的神秘信息。其中[realm]是只有程序员才会喜欢的简短领域名称。
Web 浏览器设计者注意:如果对话框本身更加用户友好,没有人会问如何抑制身份验证对话框。我做登录表单的全部原因是我们的产品管理团队正确地认为浏览器的身份验证对话框很糟糕。