SAP OData服务 - 客户端应用程序的X-CSRF-Token验证失败

时间:2016-11-29 03:21:09

标签: c# odata sap csrf kerberos

此处的任何人都熟悉SAP OData服务上的X-CSRF-Token行为,特别是在与Windows Auth(Kerberos)身份验证一起使用时?

开发针对GET / PUT服务的开发,这些服务在Postman测试中表现良好; X-CSRF-Token检索在PUT调用之前发生,并且在提交令牌时接受PUT调用(以及来自SAP Portal会话的cookie)。

测试服务在URL上使用HTTPS,例如: https://sapqe0.clientname.com.au:44380/sap/opu/odata/SAP/Z_SERVICE_NAME_SRV/TestService('参数&#39)

从.NET客户端应用程序尝试时,GET调用工作正常,包括令牌检索,但PUT返回403' CSRF令牌验证失败'错误,尽管看似有效的令牌传递。

跟踪了Fiddler,请求/响应数据包与Postman发送的数据包相同。我看到的唯一区别是客户端应用程序在每个请求上都收到不同的令牌,而邮递员在连续调用时收到相同的令牌。可能意味着会话无法通过应用程序正确识别?

C#应用程序使用Windows身份(DefaultCredentials),首先点击SAP Portal获取cookie并附加到OData请求。

在这种情况下会导致CSRF令牌验证失败的任何线索?

1 个答案:

答案 0 :(得分:0)

这是不禁用令牌的可行解决方案。
您不仅必须在请求之间共享令牌,还必须共享cookie容器。

private readonly CookieContainer cookieContainer = new CookieContainer();
private string csrfToken;

private void GetToken(Uri url)
{
    var request = (HttpWebRequest) WebRequest.Create(url);
    request.Method = WebRequestMethods.Http.Get;
    request.ContentType = "application/json";
    request.Accept = "application/json";
    request.Credentials = Credentials;
    request.CookieContainer = cookieContainer;
    request.Headers["x-csrf-token"] = "Fetch";
    var response = (HttpWebResponse) request.GetResponse();

    csrfToken = response.Headers.Get("x-csrf-token");
}