IE11覆盖Intranet环境中的Bearer授权头

时间:2015-03-09 16:41:01

标签: angularjs internet-explorer authentication windows-authentication bearer-token

我在IE11中遇到一个非常奇怪的问题,即使我通过AngularJS设置它,浏览器也会覆盖我的请求中的Authorization标头。

基本上,我为所有看起来像这样的请求注册了一个HTTP拦截器:

AuthInterceptorService.request = function (config) {
    config.headers.Authorization = "Bearer " + bearerToken;
}

这适用于所有浏览器(在某些情况下甚至是IE)。我在IIS中设置了我的应用程序以允许匿名身份验证,并且我已为此子网站禁用了基本/集成身份验证,但是,父配置具有Windows身份验证eabled。

偶尔会发生的事情是浏览器会向根网址请求静态文件(例如/favicon.ico)。使用401拒绝此请求。浏览器使用协商身份验证进行响应并获取favicon。此时,所有其他浏览器仍然让我的代码设置了Authorization标头,但是一旦在IE中进行了这种集成身份验证,授权标头似乎就会卡住 - 无论我的代码是什么,授权标头总是使用集成身份验证。这导致我的API的所有请求都失败,因为没有Bearer令牌。

我能够通过指定更本地的favicon(静态文件可以匿名提供)来解决favicon问题,但我想知道是否有一个不那么hacky解决这个问题的方法。即使在先前的请求中进行了Windows身份验证,我是否能以某种方式说服IE让我设置授权标头?

注意:我发现this question似乎是相关的(可能是相同的根本原因)。

1 个答案:

答案 0 :(得分:3)

如果查看RFC 4559 document的协商操作示例,它涉及IE使用的伪机制,用于在使用IIS进行身份验证时协商安全性选择。

  

客户第一次请求文件时,没有授权
  标头已发送,因此服务器以

响应
       S: HTTP/1.1 401 Unauthorized
       S: WWW-Authenticate: Negotiate
     

客户端将使用SPNEGO GSSAPI获取用户凭据   机制类型,用于标识生成要发送到的GPRS的GSSAPI消息   具有新请求的服务器,包括以下授权
  头:

       C: GET dir/index.html
       C: Authorization: Negotiate a87421000492aa874209af8bc028
     

服务器将解码gssapi-data并将其传递给SPNEGO
  gss_accept_security_context函数中的GSSAPI机制。如果   上下文未完成,服务器将以401状态响应   带有包含gssapi-data的WWW-Authenticate头的代码。

       S: HTTP/1.1 401 Unauthorized
       S: WWW-Authenticate: Negotiate 749efa7b23409c20b92356
     

客户端将解码gssapi-data,将其传递给
  Gss_Init_security_context,并将新的gssapi-data返回到
  服务器

所以,我不认为在谈判发生时你可能会混在一起,因为这个过程是内部的