1

这里的任何人都对 SAP OData 服务上的 X-CSRF-Token 行为有很好的了解,尤其是在与 Windows Auth (Kerberos) 身份验证一起使用时?

正在针对通过 Postman 进行测试的 GET/PUT 服务进行开发;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 ('参数')

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

使用 Fiddler 进行了追踪,请求/响应数据包看起来与 Postman 发送的相同。我看到的唯一区别是客户端应用程序在每个请求中收到不同的令牌,而 Postman 在连续调用中收到相同的令牌。可能暗示应用程序无法正确识别该会话?

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

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

4

1 回答 1

1

这是一个不禁用令牌的工作解决方案。
您不仅要在请求之间共享令牌,还要共享 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");
}
于 2018-12-05T07:18:51.210 回答