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

NTLM authentication doesn't work for JS files unless Fiddler is running

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

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

  1. 我向 localhost:444 发出请求(是的,这是正确的端口)
  2. 我没有通过身份验证,因此 IIS returns 向我的网络浏览器发送了一个 401。
  3. 我的网络浏览器知道它必须提供一个弹出窗口供我输入我的用户名和密码。我这样做。
  4. 浏览器和 IIS 执行 NTLM 身份验证流程。 (说实话,我不知道这方面的细节。)身份验证成功。浏览器理解为重新请求我在步骤 1 中的原始请求。
  5. IIS returns index.html.
  6. Index.html 引用了一个 CSS 文件和一些 JS 文件。浏览器请求这些文件。
  7. IIS returns 这些文件。

这个所需的功能正常工作...通常。当我从 Firefox、Chrome 78 或 Chrome 83 访问该站点时,一切都按预期工作。但是,当我使用 Chrome 70 访问该站点时,会发生以下情况:

  1. Index.html 引用了一个 CSS 文件和一些 JS 文件。浏览器请求这些文件。
  2. IIS returns CSS 文件,但是 returns JS 文件.
  3. 出现 401 错误

然而,当我打开 Fiddler(并将其配置为解密 https,因为我一直在使用 https)时,Chrome70 开始正常运行,就像 Firefox 和 Chrome78 和Chrome83个。我再次关闭 Fiddler,但我再次遇到同样的错误(在我的 JS 文件中)。

有人知道问题出在哪里吗?

谢谢!

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

问题出在 Angular 8/9 和 Chome 70。我遇到了 this post which helped me discover this forum thread,这(有点)解释了这个问题。

事实证明,Angular 8 改变了 index.html 格式化其 script 标签的方式。在 Angular 8+ 中,该标签使用 JS 模块等,并为不支持 JS 模块的浏览器包含一个 fall-back。但是,Chrome 70(可能还有其他)似乎支持 JS 模块很差(我不明白 Chrome 70 做什么和不做什么的确切细微差别'不做)。因此,Chrome 70 似乎对 JS 文件提出了格式错误的请求,而不是对不支持 JS 模块的浏览器使用 fall-back。具体来说,Chrome 70 请求了 JS 文件,但请求它们的 MIME 类型为“text/plain”而不是“text/javascript”。当 IIS 收到这个(假定的)格式错误的请求时,它 return 发出 401 错误。 (我原以为它会 return 一个 400 错误,但无论如何。)

我不知道为什么打开 Fiddler 可以解决这个问题。也许 Fiddler 以某种方式改变了(假设)格式错误的 headers 再次正确?我不知道。

解决方案 很简单 - 在您的 tsconfig.json 文件中,只需将目标设置为“es5”而不是“es2015”(或其他默认设置)未来)。编译成 es5 根本就没有使用混淆 Chrome 70.

的特性