Как я могу установить учетные данные NTLM (как в моем контроллере .NET) в запрос CURL? - PullRequest
0 голосов
/ 21 ноября 2018

Я работаю над проектом .NET .В контроллер этого проекта я вызываю внешний API, задающий аутентификацию, следующим образом:

private NetworkCredential myCreds = new NetworkCredential("MYUSERNAME", "MYPASSWORD", "MYDOMAIN");

private CredentialCache = new CredentialCache();

string jsonRequest = urlBaseProtocolloApi + "/api/MY_ENDPOINT";

credCache.Add(new Uri(jsonRequest), "NTLM", myCreds);

HttpWebRequest spRequest = (HttpWebRequest)HttpWebRequest.Create(jsonRequest);
spRequest.Credentials = credCache;
spRequest.UserAgent = "Mozilla/4.0+(compatible;+MSIE+5.01;+Windows+NT+5.0";
spRequest.Method = "GET";
spRequest.Accept = "application/json;odata=verbose";

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

HttpWebResponse endpointResponse = (HttpWebResponse)spRequest.GetResponse();

Он отлично работает.

Как видите, я использую это NTLM протокол для аутентификации в вызываемом API.

Моя проблема в том, что по причине теста я хочу выполнить этот вызов, используя curl вместо передачи из моего .NETконтроллер.

Я пытался таким образом:

curl -X POST -k -d @invio_a_protocollo.json https://my_machine:13003/API_CONTEXT/api/MY_ENDPOINT --header "Content-Type:application/json

, но, очевидно, поскольку я не передаю учетные данные, я получаю это сообщение об ошибке:

{"Message":"Authorization has been denied for this request."}

Как я могу попытаться установить это NTLM на моем curl запросе?

1 Ответ

0 голосов
/ 29 ноября 2018

Ваш .net автоматически использует kerberos или ntlm (он же WIA).В curl вы должны использовать флаги --ntlm или --negotiate или --anyauth и --user.

Некоторые примеры:

Это будет попытка ntlm: curl -X POST -k --ntlm --user domain\user:password -d @invio_a_protocollo.json https://my_machine:13003/API_CONTEXT/api/MY_ENDPOINT --header "Content-Type:application/json

Это попытка согласовать: curl -X POST -k --negotiate --user user:password -d @invio_a_protocollo.json https://my_machine:13003/API_CONTEXT/api/MY_ENDPOINT --header "Content-Type:application/json

Этопопробует kerberos или ntlm в зависимости от настройки IIS: curl -X POST -k --anyauth --user user:password -d @invio_a_protocollo.json https://my_machine:13003/API_CONTEXT/api/MY_ENDPOINT --header "Content-Type:application/json

Известные ошибки: В curl есть две известные ошибки, связанные с HTTPS-запросами ntlm и запросами POST:

  1. Curl отбрасывает полезную нагрузку для запросов POST с помощью ntlm: https://github.com/curl/curl/issues/2431
  2. NTLM возвращает 401, когда «Расширенная защита» равна Required по IIS: https://github.com/curl/curl/issues/3280. Чтобы устранить проблему, отключите расширенную защитуесли вы можете и жить с чертами безопасности (https://docs.microsoft.com/en-us/iis/configuration/system.webserver/security/authentication/windowsauthentication/extendedprotection/#how-to).
...