5

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

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

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

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

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

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

注意:我发现这个问题似乎是相关的(可能是相同的根本原因)。

4

1 回答 1

4

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

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

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

客户端将使用 SPNEGO GSSAPI 机制类型获取用户凭证,以识别生成一个 GSSAPI 消息,该消息将
与新请求一起发送到服务器,包括以下 Authorization
标头:

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

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

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

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

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

于 2015-03-10T20:18:00.137 回答