1

我需要通过调用需要 CSRF 令牌的 API 端点来开发一个在 HPOO 软件中触发执行的 .NET 作业。

在开始编码之前,我在 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,并传递给 request2。
  • 删除了 CSRF 标头,仅 cookie。
  • 删除了 cookie,只传递了标题。
  • 移除 CSRF 标头,仅传递 CSRF 查询和 cookie。
  • 删除了基本身份验证,仅传递 CSRF 标头和 cookie。

拜托,有人可以帮助我吗?对不起我的英语不好,巴西人在这里......

4

1 回答 1

0

我发现了问题。即使从第一个请求中收集 cookie 并将其存储在 CookieContainer 中,第二个请求也不会发送 cookie。经过一番搜索,我发现可以在标头中发送 cookie,如下所示:

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

这种方式就像一个魅力,我只需要了解为什么使用 CookieContainer 不起作用......

于 2019-02-22T14:38:10.100 回答