How can I suppress the browser's authentication dialog?我的Web应用程序有一个登录页面,该页面通过AJAX调用提交身份验证凭据。如果用户输入正确的用户名和密码,则一切正常,但如果不正确,则会发生以下情况: 直到步骤3为止,一切都很好。我不想弹出对话框,我想处理AJAX回调函数中的401响应。 (例如,通过在登录页面上显示错误消息。)当然,我希望用户重新输入用户名和密码,但是我希望他们看到我友好的,令人放心的登录表单,而不是浏览器的丑陋默认设置身份验证对话框。 顺便说一句,我无法控制服务器,因此让它返回自定义状态代码(即401以外的其他内容)不是一种选择。 有什么办法可以禁止身份验证对话框?特别是,我可以在Firefox 2或更高版本中取消"需要身份验证"对话框吗?有什么方法可以禁止IE 6及更高版本中的"连接到[主机]"对话框?
编辑 用户刚刚通过登录页面上的表单输入了用户名和密码,他认为自己已经正确键入了二者,并且单击了提交按钮或按Enter。他的期望是他将被带到下一页,或者被告知他输入的信息不正确,应重试。但是,相反,他看到一个意外的对话框。 该对话框不承认他只是输入了用户名和密码。它没有明确指出存在问题,他应该再试一次。而是,对话框为用户提供了诸如"该站点说:'[realm]'"之类的神秘信息。其中[realm]是只有程序员才能喜欢的简短领域名称。 Web浏览器设计师注意到:如果对话框本身只是更易于使用,则没人会问如何隐藏身份验证对话框。我填写登录表单的全部原因是,我们的产品管理团队正确地认为浏览器的身份验证对话框很糟糕。
我在这里遇到了相同的问题,并且我公司的后端工程师实施了一种行为,这显然是一个好习惯:当对URL的调用返回401时,如果客户端设置了标头 副作用是默认身份验证弹出窗口不会出现。
确保您的API调用将 我认为这是不可能的-如果您使用浏览器的HTTP客户端实现,它将始终弹出该对话框。我想到两个技巧: 也许Flash对此处理方式有所不同(我还没有尝试过),所以让Flash电影发出请求可能会有所帮助。 您可以在自己的服务器上为要访问的服务设置一个"代理",并对其进行一些修改,以使浏览器无法识别它们。 同时满足以下两个条件时,浏览器会弹出登录提示:
如果可以控制HTTP响应,则可以从响应中删除
如果您无法控制响应,则可以设置代理以从响应中过滤出
据我所知(如果我错了,请随时纠正我),一旦浏览器收到 我意识到这个问题及其答案非常古老。 但是,我到了这里。 也许其他人也会。 如果您有权访问返回401的Web服务的代码。在这种情况下,只需将服务更改为返回403(禁止访问),而不是返回401。浏览器将不会提示输入凭据以响应403。403是 未经授权使用特定资源的经过身份验证的用户的正确代码。 这似乎是OP的情况。 从关于403的IETF文件中:
服务器接收的有效凭据不足以 在Mozilla中,创建XMLHttpRequest对象时,可以使用以下脚本来实现它:
第二行防止出现对话框。
jan.vdbergh是事实,如果您可以将服务器端的401更改为另一个状态代码,则浏览器将无法捕获并绘制弹出窗口。 在Mozilla领域中,将XMLHttpRequest(docs)的mozBackgroundRequest参数设置为true会禁止显示这些对话框,并导致请求完全失败。但是,我不知道跨浏览器的支持程度如何(包括这些失败请求上的错误信息的质量在所有浏览器中是否都很好)。 您使用哪种服务器技术?您使用特定的产品进行身份验证吗? 由于浏览器仅在执行其工作,因此我相信您必须在服务器端进行更改,以不返回401状态代码。可以使用自定义身份验证表单来完成此操作,该表单在身份验证失败时会再次返回该表单。 我在MVC 5和VPN中也遇到了同样的问题,无论何时我们使用VPN在DMZ之外时,我们都会发现自己必须回答此浏览器消息。使用.net我只使用以下方法处理错误的路由
到目前为止,它之所以有效,是因为家庭控制器下的Index操作可以验证用户。如果登录失败,此操作中的视图将具有登录控件,我使用该控件通过传递给Directory Services的LDAP查询来使用登录用户:
尽管目前为止效果不错,但我必须让您知道我仍在对其进行测试,并且上面的代码没有理由运行,因此有可能将其删除...测试当前包括尝试发现第二组的情况代码的更多用途。同样,这是一项正在进行中的工作,但是由于它可能会有所帮助或使您的大脑有些想法,因此,我决定立即添加它……所有测试完成后,我将使用最终结果对其进行更新。
我正在使用Node,Express&Passport,并且遇到了同样的问题。 我通过将
希望对您有所帮助!
对于那些不懂C#的人,这里的
用法如下:
希望这可以节省您一些时间。 |