我目前正在使用Fortinet API制作ASP.NET C#Web Forms应用程序,目的是阻止某些IP地址或URL。
C#请求返回HTTP 403 Forbidden错误,而cURL请求POST成功。这只发生在POST请求中:GET请求在.NET和cURL中都可以正常工作。
根据我在网上找到的documentation,FortiNet API使用X-CSRFTOKEN标头验证POST请求的身份验证,并使用Cookie验证身份验证。它们包含在两个请求中。在我调试时,我已经将我的cURL请求中使用的cookie.txt文件中的cookie值替换为cookies Dictionary值中包含的cookie值,结果是相同的:它使用cURL传递,而不是使用C#传递。 / p>
这是我的RestSharp请求:
private IRestResponse createAddress(Dictionary<string, string> cookies, JObject data)
{
RestClient client = new RestClient(baseUri);
RestRequest request = new RestRequest("api/v2/cmdb/firewall/address", Method.POST);
request.AddHeader("Content-Type", "application/json");
foreach (KeyValuePair<string, string> cookie in cookies)
{
request.AddCookie(cookie.Key, cookie.Value);
}
request.AddHeader("X-CSRFTOKEN", cookies["ccsrftoken"]);
string json = JsonConvert.SerializeObject(data);
request.AddParameter("application/json", json, ParameterType.RequestBody);
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;
return client.Execute(request);
}
这是我的JSON有效负载,包含在C#中的JObject数据中,以及cURL的params.json文件中:
{
"vdom": "root",
"name": "address",
"json": {
"type": "fqdn",
"name": "lostininternet.com",
"fqdn": "lostininternet.com"
}
}
这是我的cURL请求:
curl -d "@params.json" -H "Content-Type: application/json" -H "X-CSRFTOKEN: XXXXXXXXXXXXXXXXXXXXXX" https://192.168.13.13/api/v2/cmdb/firewall/address/ -b cookie.txt --insecure --verbose
(CSRFTOKEN值被编辑,但你明白了......)
我尝试过使用HttpWebRequest而不是RestSharp,尝试使用CookieContainer而不是手动添加它们,每次都有相同的结果。
其他人是否有类似的问题?
答案 0 :(得分:0)
我正在使用FortiOS 5.6.5 Rest API。我正在使用Powershell,它可以包含C#库。验证时,服务器会为您提供该值作为Set-Cookie值,但不会将其作为Cookie发送回去。您将X-CSRFTOKEN添加为请求标头。该值不是cookie。另外,在我的案例中,我发现Powershell在字符串中添加了引号,并且删除引号为我解决了该问题。要注意的另一件事-如果路径错误-即忘记添加监视器api / cmdb路径,那么即使令牌正确,它也可能会返回403错误。