401 Требуется авторизация для запросов ajax, но повторные попытки успешны - PullRequest
0 голосов
/ 28 ноября 2011

Мы используем apache с NTLM на нашем сервере:

NTLMAuth on
AuthType NTLM
AuthName "Auth"
NTLMAuthHelper "/usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp"
NTLMBasicAuthoritative on
require valid-user

И это приводит к ошибке, когда мы используем ajax, большинство наших запросов ajax терпят неудачу с первой попытки с сообщением «Требуется авторизация 401», нопри автоматической повторной попытке они успешны, почему есть разница между обоими запросами?

Наше приложение работает, но эта ошибка раздражает, использует ресурсы и замедляет работу приложения.

1 Ответ

1 голос
/ 29 ноября 2011

Я подозреваю, что на самом деле вы видите не какое-то поведение "автоматической повторной попытки", а аутентификацию NTLM с запросом-ответом . По своей природе вам нужно будет добавить дополнительный туда-обратно к первому запросу на соединение. Аутентификация должна выглядеть следующим образом:

  1. Клиент запрашивает ресурс, защищенный проверкой подлинности NTLM.
  2. Сервер ответит 401 несанкционированным и укажет механизмы, которые он поддерживает (в данном примере, NTLM).
  3. Клиент запрашивает ресурс с начальным сообщением аутентификации NTLM (сообщение «тип 1»), которое содержит домен пользователя и имя пользователя, а также возможности клиента.
  4. Сервер отвечает 401 несанкционированным и вызовом NTLM (сообщение «тип 2»).
  5. Клиент вычисляет ответ на запрос сервера, а затем запрашивает ресурс с окончательным сообщением аутентификации NTLM (сообщение «тип 3»).
  6. Сервер отвечает соответствующим кодом - если аутентификация не удалась, это будет 401, если аутентификация прошла успешно, это будет успех, не найден и т. Д.

Так что да, вы будете использовать некоторые дополнительные ресурсы для проверки подлинности NTLM (во всяком случае, через обычную проверку подлинности.) Обратите внимание, однако, что NTLM проверяет подлинность соединения , а не запроса . Таким образом, последующие запросы по одному и тому же поддерживаемому HTTP-соединению не требуют повторной аутентификации. Это уменьшает бремя характера «вызов-ответ».

Наконец, обратите внимание, что большинство веб-браузеров, поддерживающих NTLM или SPNEGO, подготовлены для этого и будут использовать функцию «ожидать / продолжить». Таким образом, они не будут отправлять данные POST (например) в начальном соединении, пока не будут аутентифицированы и не получат HTTP-продолжение от сервера, что также должно уменьшить нагрузку.

...