Завершение запроса с аутентификацией ntlm не выполняется, если установлен пароль
Я пытаюсь получить некоторые данные из веб-службы Microsoft Dynamics Nav. Этот сервис использует NTML-аутентификацию.
Если я открываю URL веб-службы в браузере и использую данные учетные данные, все работает нормально.
Для настройки среды для клиента WebService я использовал командную строку, чтобы проверить, все ли работает нормально, в определенный момент я не смог пройти проверку подлинности.
Вот команда, которую я использую:
curl --ntlm -u "DOMAIN\USERNAME" -k -v "http://hostname:port/instance/Odata/Company('CompanyName')/Customer"
Команда запросит пароль. Копирую пароль и все отлично.
Но когда я использую эту команду с уже включенным паролем, она перестает работать, и аутентификация не проходит:
curl --ntlm -u "DOMAIN\USERNAME:PASSWORD" -k -v "http://hostname:port/instance/Odata/Company('CompanyName')/Customer"
Пароль содержит некоторые специальные символы, поэтому я попытался использовать кодировку процентов, которая не имела никакого эффекта.
Очень трудно исследовать этот вид проблемы. Поиск проблем с аутентификацией curl + ntlm дает много результатов, но с этим конкретным видом проблем ничего не связано.
Кто-нибудь из вас, ребята, уже имел опыт работы с такого рода проблемами?
2 ответа
У меня была проблема с аутентификацией из-за файлов cookie. Я решил это с помощью файлов cookie в текстовом файле и использовал именно этот файл во всех запросах. Например, после запроса входа я сохранил эти куки:
curl -X POST -u username:password https://mysite/login -c cookies.txt
И со следующим запросом я использовал этот файл так:
curl -X POST -u username:password https://mysite/link -b cookies.txt
Это решение сработало для меня, я не знаю, похожа ли ваша проблема, но, думаю, вы можете попробовать это.
Я долго боролся с подобной проблемой и, наконец, обнаружил, что отчет об ошибке скручивания #1253 Проверка подлинности NTLM не выполняется, когда пароль содержит специальные символы (символ британского фунта £).
Проверка подлинности NTLM в cURL поддерживает только символы ASCII в паролях! Это все еще так в версии 7.50.1 на Ubuntu, но я проверял это на многих разных дистрибутивах, и это всегда одинаково. Эта ошибка также нарушает curl_init() в PHP (проверено на PHP7). Единственный способ решить эту проблему - избежать использования не ASCII-символов в паролях аутентификации NTLM.
Если вы используете Python, то вам повезло. Очевидно, разработчики Python переписали реализацию cURL, и она работает с не-ASCII символами, если вы используете пакет HttpNtlmAuth.
Попробуйте с флагом nltm.
Что-то вроде этого:
curl -v --proxy-nltm -u 'username:password' youproxy.com:8080 someURL
from > curl --help
-x, --proxy [PROTOCOL://]HOST[:PORT] Use proxy on given port
--proxy-anyauth Pick "any" proxy authentication method (H)
--proxy-basic Use Basic authentication on the proxy (H)
--proxy-digest Use Digest authentication on the proxy (H)
--proxy-negotiate Use Negotiate authentication on the proxy (H)
--proxy-ntlm Use NTLM authentication on the proxy (H)