C # вызов конечной точки API с токеном CSRF не работает - PullRequest
0 голосов
/ 21 февраля 2019

Мне нужно разработать задание .NET, которое запускает выполнение в программном обеспечении HPOO, вызывая конечную точку API, для которой требуется токен CSRF.

Прежде, чем я начал кодировать, я тестировал сценарий в Postman:

  • вызов обычной конечной точки GET только с базовой аутентификацией
  • , возвращающей токен CSRF
  • и, наконец, вызов POST API, передача базовой аутентификации вместе с токеном CSRF.

Когда я выполнял эти тесты в Postman, все работало, как и ожидалось.

Когда я пытаюсь реализовать тот же сценарий в коде, программа блокируется при вызове конечной точки POST (передача токена).

Следуйте моему коду ниже:

ServicePointManager.ServerCertificateValidationCallback = delegate (object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; };
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;

var uriExecution = new Uri("https://hpoo-api.com.br/oo/rest/v2/executions");
var cookies = new CookieContainer();

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uriExecution);
request.Method = "GET";
request.ContentType = "application/json; charset=utf-8";
request.Headers.Add("Authorization", "Basic " + GetBasicAuthenticaton());
request.CookieContainer = cookies;

var response = request.GetResponse();

var csrf = response.Headers.Get("X-CSRF-TOKEN");

HttpWebRequest request2 = (HttpWebRequest)WebRequest.Create(uriExecution);
request2.Method = "POST";
request.ContentType = "application/json; charset=utf-8";
request.Accept = "application/json";
request2.Headers.Add("Authorization", "Basic " + GetBasicAuthenticaton());
request2.Headers.Add("X-CSRF-TOKEN", csrf);
request2.CookieContainer = cookies;

var response2 = request2.GetResponse();

В тот момент, когда мой код вызывает метод GetResponse() из request2, я получаю исключение о том, что мне запрещен доступ (403),

Я тоже пытался с библиотекой HttpClient, но я получил ту же ошибку, указав, что я забыл токен CSRF.

Некоторые вещи, которые я уже пробовал, которые не работали:

  • Создан новый CookieContainer со всеми файлами cookie в первом запросе и передачей в запрос 2.
  • Удален заголовок CSRF, только файлы cookie.
  • Удаленокуки, только передавая заголовок.
  • Удален заголовок CSRF, только передавая запрос CSRF и куки.
  • Удалена базовая аутентификация, только передавая заголовок CSRF и куки.

Пожалуйста, кто-нибудь может мне помочь?Извините за мой плохой английский, бразильский здесь ...

1 Ответ

0 голосов
/ 22 февраля 2019

Я обнаружил проблему.Даже при получении файлов cookie из первого запроса и их сохранении в CookieContainer второй запрос не отправлял файлы cookie.После некоторого поиска я вижу, что можно отправлять куки в заголовке, например:

request.Headers.Add("Cookie", "cookie1=value1; cookie2=value2");

Этот способ работает как чудо, мне нужно только понять, почему использование CookieContainer не работает ...

...