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