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

Jos*_*ron 5 authentication internet-explorer windows-authentication angularjs bearer-token

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

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

AuthInterceptorService.request = function (config) {
    config.headers.Authorization = "Bearer " + bearerToken;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

注意:我发现这个问题似乎是相关的(也许是相同的根本原因).

Rom*_*las 4

如果您查看RFC 4559 文档的协商操作示例,它涉及 IE 在与 IIS 进行身份验证时协商安全选择的伪机制。

客户端第一次请求文档时,没有
发送 Authorization 标头,因此服务器响应

       S: HTTP/1.1 401 Unauthorized
       S: WWW-Authenticate: Negotiate
Run Code Online (Sandbox Code Playgroud)

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

       C: GET dir/index.html
       C: Authorization: Negotiate a87421000492aa874209af8bc028
Run Code Online (Sandbox Code Playgroud)

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

       S: HTTP/1.1 401 Unauthorized
       S: WWW-Authenticate: Negotiate 749efa7b23409c20b92356
Run Code Online (Sandbox Code Playgroud)

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

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