C#使用CSRF令牌调用API端点不起作用

C#使用CSRF令牌调用API端点不起作用,c#,.net,api,httpwebrequest,csrf-token,C#,.net,Api,Httpwebrequest,Csrf Token,我需要开发一个.NET作业,通过调用需要CSRF令牌的API端点来触发HPOO软件中的执行 在开始编写代码之前,我在Postman中测试了该场景: 仅使用基本身份验证调用普通GET端点 取回CSRF令牌 然后最后调用POST API,将基本身份验证与CSRF令牌一起传递 当我在《邮递员》中做这些测试时,一切都如期进行 当我尝试在代码中实现相同的场景时,程序在调用POST端点(传递令牌)时会阻塞 请按照下面的代码操作: ServicePointManager.ServerCertificate

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

在开始编写代码之前,我在Postman中测试了该场景:

  • 仅使用基本身份验证调用普通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();
在我的代码调用
request2
的方法
GetResponse()
的那一刻,我得到一个异常,说我被禁止访问(403)

我也尝试了
HttpClient
库,但我得到了相同的错误,指定我忘记了CSRF令牌

一些我已经尝试过但不起作用的东西:

  • 创建一个新的
    CookieContainer
    ,在第一个请求中包含所有cookie,并传递给请求者2
  • 已删除CSRF标头,仅删除Cookie
  • 删除Cookie,仅传递标头
  • 删除了CSRF头,只传递CSRF查询和cookie
  • 删除了基本身份验证,仅传递CSRF头和cookie
拜托,有人能帮我吗?
对不起,我的英语不好,巴西人…

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

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

这种方式很有魅力,我只需要理解为什么使用CookieContainer不起作用……

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

request.Headers.Add("Cookie", "cookie1=value1; cookie2=value2");
这种方式很有魅力,我只需要理解为什么使用CookieContainer不起作用