C#使用CSRF令牌调用API端点不起作用
我需要开发一个.NET作业,通过调用需要CSRF令牌的API端点来触发HPOO软件中的执行 在开始编写代码之前,我在Postman中测试了该场景: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
- 仅使用基本身份验证调用普通GET端点
- 取回CSRF令牌
- 然后最后调用POST API,将基本身份验证与CSRF令牌一起传递李>
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令牌
一些我已经尝试过但不起作用的东西:
- 创建一个新的
,在第一个请求中包含所有cookie,并传递给请求者2CookieContainer
- 已删除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不起作用