如何防止浏览器调用基本的身份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标头)。