Проверка подлинности NTLM не работает для файлов JS, если не запущен Fiddler - PullRequest
0 голосов
/ 09 июля 2020

Я запускаю приложение ASP. NET 4 в IIS с использованием аутентификации NTLM (Windows). Все остальные схемы аутентификации отключены. Я могу успешно пройти аутентификацию на сервере. Однако даже после успешной аутентификации сервер (при определенных обстоятельствах, описанных ниже) по-прежнему возвращает ошибку 401 Unauthorized, когда я запрашиваю файлы Javascript. Почему мне не разрешено загружать JS файлы?

Конечно, я не совсем понимаю, как работает NTLM, но я ожидаю, что когда я запрашиваю защищенный ресурс, произойдет что-то вроде следующего:

  1. Я делаю запрос на localhost: 444 (да, это правильный порт)
  2. Я не аутентифицирован, поэтому IIS возвращает 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 работают правильно, как описано выше.
Индекс. html ссылается на файл CSS и некоторые файлы JS. Браузер запрашивает эти файлы. IIS возвращает CSS файл, , но возвращает ошибку 401 для JS файла .

Затем, однако, когда я включил Fiddler (и настроил его на расшифровку https, потому что я использовал https), Chrome 70 начал вести себя правильно, как Firefox и Chrome 78 и Chrome 83. Я снова выключил Fiddler и снова получил ту же ошибку (в моем JS файле).

Кто-нибудь знает, в чем проблема?

Спасибо!

1 Ответ

1 голос
/ 10 июля 2020

Проблема была не в аутентификации; аутентификация работала правильно.

Проблема была с Angular 8/9 и Chome 70. Я наткнулся на этот пост , который помог мне обнаружить эту ветку форума который (sortof) объясняет проблему.

Оказывается, Angular 8 изменил способ, которым index. html форматирует свой тег script. В Angular 8+ тег использует модули JS и тому подобное, а также включает в себя откат для браузеров, которые не поддерживают модули JS. Однако Chrome 70 (и, возможно, другие), похоже, поддерживает JS модулей плохо (я не понимаю точных нюансов того, что Chrome 70 делает и чего не делает). Следовательно, вместо использования отката для браузеров, которые не поддерживают модули JS, Chrome 70, похоже, сделал неверный запрос для файлов JS. В частности, Chrome 70 запросил файлы JS, но запросил их тип MIME «text / plain» вместо «text / javascript». Когда IIS получил этот (предположительно) искаженный запрос, он возвратил ошибку 401. (Я бы подумал, что это вернет ошибку 400, но неважно.)

Я не знаю, почему включение Fiddler устранило проблему. Может быть, Fiddler каким-то образом изменил (предположительно) искаженные заголовки, чтобы они снова стали правильными? Я не знаю.

Решение простое - в вашем файле tsconfig. json просто установите цель на «es5» вместо «es2015» (или что-то еще дефолт в будущем). При компиляции в es5 просто не используются функции, которые сбивают с толку Chrome 70.

...