我需要通过调用需要 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。
拜托,有人可以帮助我吗?对不起我的英语不好,巴西人在这里......