FortiGate API POST请求返回403禁止使用C#RestSharp

时间:2018-02-22 17:16:07

标签: c# rest curl restsharp

我目前正在使用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而不是手动添加它们,每次都有相同的结果。

其他人是否有类似的问题?

1 个答案:

答案 0 :(得分:0)

我正在使用FortiOS 5.6.5 Rest API。我正在使用Powershell,它可以包含C#库。验证时,服务器会为您提供该值作为Set-Cookie值,但不会将其作为Cookie发送回去。您将X-CSRFTOKEN添加为请求标头。该值不是cookie。另外,在我的案例中,我发现Powershell在字符串中添加了引号,并且删除引号为我解决了该问题。要注意的另一件事-如果路径错误-即忘记添加监视器api / cmdb路径,那么即使令牌正确,它也可能会返回403错误。