NTLM 身份验证不适用于 JS 文件,除非 Fiddler 正在运行



我正在IIS中使用NTLM(Windows(身份验证运行ASP.NET 4应用程序。所有其他身份验证方案都被禁用。我能够成功地向服务器进行身份验证。然而,即使在成功验证之后,当我请求Javascript文件时,服务器(在下面解释的某些情况下(仍然会返回401 Unauthorized错误。为什么我未经授权下载JS文件?

当然,我不完全理解NTLM是如何工作的,但当我请求受保护的资源时,我预计会发生以下情况:

  1. 我向localhost:444发出请求(是的,这是正确的端口(
  2. 我没有通过身份验证,所以IIS向我的web浏览器返回401
  3. 我的网络浏览器知道它必须为我提供一个弹出窗口,在其中输入我的用户名和密码。我是这么做的
  4. 浏览器和IIS执行NTLM身份验证流。(tbh,我不知道详细情况。(身份验证成功。浏览器理解从步骤1重新请求我的原始请求
  5. IIS返回index.html
  6. Index.html引用了一个CSS文件和一些JS文件。浏览器请求这些文件
  7. IIS返回这些文件

此所需功能正在运行。。。通常当我从Firefox、Chrome 78或Chrome 83访问网站时,一切都如预期。然而,当我使用Chrome 70访问网站时,会出现以下情况:

  • 如上所述,步骤1至5工作正常
  1. Index.html引用了一个CSS文件和一些JS文件。浏览器请求这些文件
  2. IIS返回CSS文件,但返回JS文件的401错误

然而,当我打开Fiddler(并将其配置为解密https,因为我一直在使用https(时,Chrome 70开始正常运行,就像Firefox、Chrome 78和Chrome 83一样。我再次关闭了Fiddler,我再次得到了同样的错误(在我的JS文件上(。

有人知道问题是什么吗?

谢谢!

问题不在于身份验证;身份验证工作正常。

问题出在Angular 8/9和Chome 70上。我偶然看到这篇帖子,它帮助我发现了这个论坛帖子,它(在某种程度上(解释了这个问题。

事实证明,Angular 8改变了index.html格式化其script标记的方式。在Angular 8+中,标签使用JS模块等,并包括不支持JS模块的浏览器的回退。然而,Chrome 70(可能还有其他(似乎对JS模块的支持很差(我不明白Chrome 70做什么和不做什么的确切区别(。因此,Chrome 70似乎对JS文件发出了一个格式错误的请求,而不是对不支持JS模块的浏览器使用回退。具体地,Chrome 70请求JS文件,但请求它们的MIME类型为"JS";text/plain";而不是";text/javascript";。当IIS收到这个(假定(格式错误的请求时,它返回了一个401错误。(我本以为它会返回400的错误,但不管怎样。(

我不知道为什么打开Fiddler解决了这个问题。也许菲德勒以某种方式改变了(假设(错误的标题,使其再次正确?我不知道。

解决方案很简单-在tsconfig.json文件中,只需将目标设置为";es5";而不是";es2015";(或者其他什么是未来的默认值(。编译到es5根本没有使用混淆chrome70的功能。

最新更新