2016-09-12 4 views
0

При включении проверки подлинности NTLM для веб-страницы интрасети мы получили следующую проблему.Ссылка на внешние скрипты при неудачной проверке подлинности NTLM

Наш код веб-страницы есть некоторые JavaScript-файлы, на которые ссылается в заголовке

<link rel="stylesheet" type="text/css" href="./jsoneditor.css"> 
<script type="text/javascript" src="./jsoneditor.js"></script> 
<script type="text/javascript" src="./lib/ace/ace.js"></script> 
<script type="text/javascript" src="./lib/ace/mode-json.js"></script> 
<script type="text/javascript" src="./lib/ace/theme-textmate.js"></script> 
<script type="text/javascript" src="./lib/ace/theme-jsoneditor.js"></script> 
<script type="text/javascript" src="./lib/jquery.js"></script> 
<script type="text/javascript" src="./lib/jsonlint/jsonlint.js"></script> 

Некоторые функции из этих файлов, называются далее в теле страницы.

Как работает нормально (без аутентификации). При открытии страницы, там идет запрос на index.html, то отдельный запрос для каждого ресурса ссылка:

Requests seen in Firebug without authentication

Они обрабатываются в порядке ссылок (вы можете видеть, что порядок файлов в <script> тегах такие же, как порядок запросов. Как обрабатывается файл .html?

Html file processing

так что идет запрос на ресурс и синтаксический анализ останавливается, пока не придет ответ. Затем она продолжает выполнение, если таковые имеются, и переходит к следующему сценарию.

Так что, если необходим какой-то заказ, например, ace.js требует, чтобы jsoneditor.js загружался первым, он обеспечивается.

Хорошо, это было введение, теперь к аутентификации NTLM. Это изменяет способ получения ресурсов из-за рукопожатия NTLM. Это выглядит так:

1: C --> S GET ... 
2: C <-- S 401 Unauthorized, WWW-Authenticate: NTLM 
3: C --> S GET ..., Authorization: NTLM <base64-encoded type-1-message> 
4: C <-- S 401 Unauthorized, WWW-Authenticate: NTLM <base64-encoded type-2-message> 
5: C --> S GET ..., Authorization: NTLM <base64-encoded type-3-message> 
6: C <-- S 200 Ok 

Таким образом, для одного ресурса отправляется 3 запроса, а не один.

Почему это имеет значение? Поскольку анализатор веб-страниц, отправляющий запрос на внешний ресурс, не волнует, если он был фактически доставлен или нет, он просто ждет ответа (который в нашем случае равен 401) и переходит к загрузке следующих скриптов , В конце концов, все файлы приходят, но (1) порядок не применяется, и (2) вызов функций в теле может выполняться, хотя ресурсы еще не были получены (с успешным ответчиком 200). И это может привести к тому, что исключение javascript будет выбрано, а страница не будет загружена.

Requests seen in Firebug with NTLM authentication

Вы можете увидеть правильный порядок первых запросов и что ответы с кодом состояния 200 приходят смешанные.

Существуют два решения, которые мы выяснили, но ни один не удовлетворяет нас:

  1. Когда Javascript функции в теле выполняется, применять некоторую задержку (которая не хороший подход, конечно)
  2. Move все javascript-код в index.html и не ссылаются на внешние ресурсы, что не очень удобно с точки зрения кода, но гарантирует, что все будет работать так, как ожидалось.

К сожалению, NTLM предназначен для аутентификации каждого запроса отдельно, что немного усложняет дело. Изменение NTLM на другую аутентификацию невозможно в нашем сценарии.

Есть ли способ решить проблему более элегантным способом?

Для решения этой проблемы мы используем класс .NET HttpListener как наш хост.

+0

* «анализатор веб-страниц, который отправляет запрос на внешний ресурс, не волнует, если он был фактически доставлен или нет» * - звучит так, как разбор парсера веб-страницы нарушен. * «порядок не соблюдается» * - порядок, в котором поступают ответы, никогда не применяется в HTTP. – Tomalak

ответ

0

Для приложения для производства вы должны запустить процесс сборки перед развертыванием, который в любом случае объединяет и минимизирует ваши скрипты. Это устранит проблему заказа, поскольку все они будут доставлены в виде одного файла с содержимым в правильном порядке.