如何防止浏览器调用基本的身份validationpopup窗口,并使用JQuery处理401错误?
我需要使用基本身份validation发送授权请求。 我已经成功实现了这个使用jQuery。 但是,当我得到401错误基本身份validation浏览器popup窗口被打开和jQuery的AJAX错误callback不会被调用。
我最近也在面对这个问题。 由于在401( 基本或摘要式身份validation)的情况下,您无法更改浏览器显示popup窗口的默认行为,因此有两种方法可以解决此问题:
- 将服务器响应更改为不返回401,而是返回200代码,并在您的jQuery客户端中处理。
-
将您用于授权的方法更改为标题中的自定义值。 浏览器将显示“ 基本”和“摘要”的popup窗口。 您必须在客户端和服务器上都更改此设置。
标题:{“Authorization”:“BasicCustom”}
另外请看一下在基本身份validation中使用jQuery的例子。
返回一个通用的400状态码,然后处理该客户端。
或者你可以保留401,而不是返回WWW-Authenticate头,这真的是浏览器正在用身份validationpopup窗口响应。 如果WWW-Authenticate标题丢失,那么浏览器将不会提示input凭据。
你可以禁止基本的authpopup与请求url看起来像这样:
https://username:password@example.com/admin/...
如果你得到401错误(错误的用户名或密码),将正确处理与jquery错误callback。 它可能会导致一些安全问题(在http协议的情况下,而不是https),但它的工作。
UPD:此解决scheme支持将在Chrome 59中删除
正如其他人所指出的那样,改变浏览器行为的唯一方法是确保响应不包含401状态码,否则不包含WWW-Authenticate: Basic
标头。 由于更改状态码不是非常的语义和不可取的,一个好的方法是删除WWW-Authenticate
头。 如果您不能或不想修改您的Web服务器应用程序,您可以始终通过Apache进行服务或代理(如果您尚未使用Apache)。
这里是Apache重写响应以删除WWW-Authenticate头的configuration。请求包含的IFF包含头X-Requested-With: XMLHttpRequest
(默认情况下由主要Javascript框架如JQuery / AngularJS等设置。 。)并且响应包含WWW-Authenticate: Basic
头。
testingApache 2.4(不知道它是否适用于2.2)。 这依赖于正在安装的mod_headers
模块。 (在Debian / Ubuntu上, sudo a2enmod headers
并重新启动Apache)
<Location /> # Make sure that if it is an XHR request, # we don't send back basic authentication header. # This is to prevent the browser from displaying a basic auth login dialog. Header unset WWW-Authenticate "expr=req('X-Requested-With') == 'XMLHttpRequest' && resp('WWW-Authenticate') =~ /^Basic/" </Location>
另外,如果你可以定制你的服务器响应,你可以返回一个403 Forbidden。
浏览器不会打开身份validationpopup窗口和jquerycallback将被调用。
在您的请求头中使用X-Requested-With:XMLHttpRequest。 所以响应标题将不包含WWW-Authenticate:Basic。
beforeSend: function (xhr) { xhr.setRequestHeader('Authorization', ("Basic " .concat(btoa(key)))); xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); },
如果您使用的是IIS服务器,则可以设置IIS URL重写(v2),以在请求的URL上将WWW-Authentication
标头重写为None
。
指南在这里 。
你想改变的值是response_www_authenticate
。
如果您需要更多信息,请添加评论,然后发布web.config文件。
如果WWW-Authenticate标题被删除,那么你不会得到证书的caching,并且不会在请求中取回Authorization标头。 这意味着现在您将不得不input您生成的每个新请求的凭据。
创build一个/loginurl,而不是通过GET接受“用户”和“密码”参数,不需要基本的身份validation。 在这里,使用php,node,java,然后parsing你的passwd文件并匹配参数(user / pass)。 如果匹配,则redirect到http:// user:pass@domain.com/ (如果没有,将在您的浏览器上设置凭据),发送401响应(没有WWW-Authenticate标头)。