我在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似乎是相关的(可能是相同的根本原因)。
答案 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返回到
服务器
所以,我不认为在谈判发生时你可能会混在一起,因为这个过程是内部的