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