С#, вызывающий конечную точку API с токеном CSRF, не работает

Мне нужно разработать задание .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, только куки.
  • Удалил куки, передав только заголовок.
  • Удален заголовок CSRF, передавая только запрос CSRF и файлы cookie.
  • Удалена базовая аутентификация, передаются только заголовок CSRF и файлы cookie.

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


person João Paulo    schedule 21.02.2019    source источник


Ответы (1)


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

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

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

person João Paulo    schedule 22.02.2019