如何防止浏览器调用基本的auth弹出窗口并使用Jquery处理401错误?

Ale*_*rov 98 javascript rest jquery basic-authentication

我需要使用基本身份验证发送授权请求.我已经使用jquery成功实现了这一点.但是当我得到401错误时,基本的auth浏览器弹出窗口被打开,并且没有调用jquery ajax错误回调.

nwi*_*ler 42

我最近也面临这个问题.由于您无法在401(基本摘要式身份验证)的情况下更改浏览器显示弹出窗口的默认行为,因此有两种方法可以解决此问题:

  • 将服务器响应更改为不返回a 401.返回200代码并在jQuery客户端中处理它.
  • 将您用于授权的方法更改为标题中的自定义值.浏览器将显示BasicDigest的弹出窗口.您必须在客户端和服务器上更改此设置.

    headers : {
      "Authorization" : "BasicCustom"
    }
    
    Run Code Online (Sandbox Code Playgroud)

也请看一看对于使用jQuery使用基本身份验证的一个例子.

  • WWW-Authenticate:xBasic realm = com.example可以与经典的401状态代码一起完成.这篇博文向我展示了提示(我不是博客的所有者)http://loudvchar.blogspot.ca/2010/11/avoiding-browser-popup-for-401.html (9认同)
  • @PM,博客的答案是一个完美的解决方案.请注意,如果使用`<security:http-basic />`,则不需要定义`basicAuthenticationFilter`,但应将其定义为`<security:http-basic entry-point-ref ="myBasicAuthenticationEntryPoint"/>`. (2认同)
  • @PM仅供参考,此方法在当前的 Chrome 版本中不再有效 (2认同)

Ibr*_*eem 32

返回通用的400状态代码,然后处理该客户端.

或者您可以保留401,而不是返回WWW-Authenticate标头,这正是浏览器使用身份验证弹出窗口响应的内容.如果缺少WWW-Authenticate标头,则浏览器将不会提示输入凭据.

  • @MortenHaraldsen那么401响应是在这种情况下给出的正确响应,问题是浏览器本身自动处理,而不是允许javascript应用程序处理它.您可以通过不返回标准建议的正确响应来坚持标准,或者您可以通过返回标准建议的响应代码来选择不遵守标准.拿你的选择:) (6认同)
  • @Ibraheem,我自己说得再好不过了。标准是由坐下来交谈的人创建的,而不一定是坐下来编码的人。 (2认同)

Iva*_*var 17

您可以使用请求网址抑制基本身份验证弹出窗口,如下所示:

https://username:password@example.com/admin/...
Run Code Online (Sandbox Code Playgroud)

如果您收到401错误(用户名或密码错误),将使用jquery错误回调正确处理.它可能会导致一些安全问题(在http协议而不是https的情况下),但它是有效的.

UPD:此解决方案支持将在Chrome 59中删除

  • 请不要这样做,您的网络服务器上的请求日志现在对我来说更有价值..免费用户名和密码组合加上响应代码!谢谢 (16认同)
  • 这种身份验证方法正在变得折旧,Chrome将在2017年6月左右放弃对嵌入式凭据的支持,即在M59中的"https:// user:pass @ host /".请参阅[此chromestatus博客文章](https://www.chromestatus. com/feature/5669008342777856)了解更多信息. (3认同)
  • 如果您在任何浏览器中转到开发人员工具下的“网络”选项卡,您都可以以纯文本形式读取用户名和密码。不过,它确实有效。 (2认同)

小智 10

正如其他人所指出的,改变浏览器行为的唯一方法是确保响应不包含401状态代码,或者如果包含,则不包括WWW-Authenticate: Basic标题.由于更改状态代码不是非常语义和不可取的,因此一种好方法是删除WWW-Authenticate标题.如果您不能或不想修改您的Web服务器应用程序,您始终可以通过Apache提供或代理它(如果您尚未使用Apache).

这是一个Apache重写响应的配置,以删除请求包含的WWW-Authenticate头IFF包含头X-Requested-With: XMLHttpRequest(默认情况下由JQuery/AngularJS等主要Javascript框架设置...)并且响应包含标题WWW-Authenticate: Basic.

在Apache 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>   
Run Code Online (Sandbox Code Playgroud)


sed*_*dhu 8

将 X-Requested-With: XMLHttpRequest 与您的请求标头一起使用。所以响应头将不包含 WWW-Authenticate:Basic。

beforeSend: function (xhr) {
                    xhr.setRequestHeader('Authorization', ("Basic "
                        .concat(btoa(key))));
                    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
                },
Run Code Online (Sandbox Code Playgroud)


Zym*_*tik 5

如果使用的是IIS服务器,则可以设置IIS URL重写(v2)以将WWW-Authentication标头重写为None所请求的URL。

在这里指导

您要更改的值为response_www_authenticate

如果您需要更多信息,请添加评论,然后我将发布web.config文件。