C# вызов конечной точки API с токеном CSRF не работает

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

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

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

Все работало, как и ожидалось, когда я делал эти тесты в Почтальоне.

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

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

1 ответ

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

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

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

Другие вопросы по тегам