SAP ODATA服务-X-CSRF-Token验证因客户端应用而失败



这里有人对SAP ODATA服务的X-CSRF token行为有很好的了解,特别是与Windows Auth(Kerberos)Authentication一起使用?

正在开发反对通过Postman测试的GET/PUT服务;X-CSRF token检索发生在put呼叫之前,并且在将令牌提交后(以及SAP Portal session的cookie)时接受了呼叫。

测试服务在URL上的HTTPS上,例如:https://sapqe0.clientname.com.au:44380/sap/sap/opu/odata/sap/z_service_name_srv/testservice('parameter'')

尝试从.NET客户端应用程序进行尝试时,将呼叫的工作正常工作,包括令牌检索,但是尽管看似有效的令牌,但PUT返回了403'CSRF代币验证失败'错误。

已经与提琴手一起追踪,并且请求/响应数据包看起来与Postman发送的内容相同。我看到的唯一区别是,客户应用在每个请求上都会收到一个不同的令牌,而Postman在连续的呼叫上收到相同的令牌。可能暗示会话未正确识别该应用程序?

C#应用程序正在使用Windows Identity(DefaultCredentials),并首先命中SAP门户以获取cookie并将其附加到ODATA请求。

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

这是一个工作解决方案而不禁用令牌。
您不仅必须共享令牌,而且还必须在请求之间共享cookiecontainer。

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");
}

相关内容

最新更新