当前位置: 首页 > 知识库问答 >
问题:

C#:即使在使用http客户端发送CSRF令牌后也能得到403

司徒焕
2023-03-14

我试图发布一个有效载荷到我们的后端系统从我的UWP应用程序。为此,我首先做一个GET来获取CSRF令牌,然后将其添加到POST请求的标题中。虽然发布,我仍然得到403禁止错误。

我正在用“失眠症”REST客户端进行交叉测试,通过执行单独的GET和POST请求,并将从GET获取的CSRF令牌提供给POST头,它工作正常。

我是新来的C#,所以请原谅不好的编码标准。

拿到代币

    public async Task<string> GetCSRF()
    {
        using (HttpClient httpClient = new HttpClient())
        {
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(
                                                                                                                    System.Text.Encoding.ASCII.GetBytes(
                                                                                                                            string.Format("{0}:{1}", userName.Text.ToUpper(), SAPpassword.Password))));
            httpClient.DefaultRequestHeaders.Add("X-CSRF-TOKEN", "fetch");
            HttpResponseMessage response = await httpClient.GetAsync(new Uri(_URI));
            response.EnsureSuccessStatusCode();
            if (response.Content == null)
                return null;
            String csrfToken = response.Headers.GetValues("X-CSRF-TOKEN").FirstOrDefault();
            return csrfToken;
        }
    }

我收到了带有csrf令牌的以下标头

  • 答复。标题{x-csrf-token:w1Id2Kn1r0d6EItk6vEi0g==缓存控制:无存储,无缓存sap元数据上次修改时间:2017年9月1日星期五10:57:07 GMT数据服务版本:2.0集cookie:sap usercontext=sap client=100;path=/,MySapss2=AJQXMDMBabHtafMarqOecaQaQaQaGaaCaiaAyayXaDaaQaQaQaQaGaaGaaAaAyaQaAaAyaYmaBaaQaQaBaaQaQaQaQaAaQaQaGaaAaAaAaAaQaAaQaAaQaACQACRQD/APSWGFGCSQGSIB3DQEHACB6JCB5WIBATELMAKWYJKOZHVCNAQCBMYHMHIAGEBBKWDJEMMAOGA1EAXMDR1CAXAGGFAMOABMAKQHKIG9W0BCQMXCWYJKOZHVCNAQCBMBWGCSQIB3DQEJBTEPFW0NZA5MDEYMDQ8ST9P53T9SFU58STKJJKKKKKKKQDBC8W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W7W==; 路径=/;域=。mindsetconsulting。com,SAP_SESSIONID_GW1_100=u1BKLug0BNWYM0-zg_JWTBEihxmPVxHnvTMKDkBCwEk=;path=/access control allow credentials:true access control allow标头:*access control allow origin:*。谷歌。com访问控制允许方法:}系统。网Http。标题。httpresponses负责人

用令牌发送有效载荷

        public async Task<string> SendChannelToSAP(UserStorage userStorage, string csrf)
    {
        string payloadJson;
        string jsonResponse;
        HttpResponseMessage response;
        HttpContent content;

        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
                                                            "Basic", Convert.ToBase64String(
                                                                System.Text.Encoding.ASCII.GetBytes(
                                                                     string.Format("{0}:{1}", userName.Text.ToUpper(), SAPpassword.Password))));


            payloadJson = JsonConvert.SerializeObject(userStorage);
            content     = new StringContent(payloadJson);
            content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
            client.DefaultRequestHeaders.Add("x-csrf-token", csrf);
            try
            {
                response = await client.PostAsync(_URI, content);
                if (response.IsSuccessStatusCode)
                {
                    jsonResponse = await response.Content.ReadAsStringAsync();
                    return jsonResponse;
                    //do something with json response here                    
                }
                else
                {
                    return null;
                }

            }
            catch (Exception e)
            {
                string error = e.GetBaseException().ToString();
                //Could not connect to server
                return null;
            }
        }
    }

我得到以下回应

  • 响应{StatusCode:403,ReasonPhrase:'禁止',版本:1.1,内容:System.Net.Http.StreamContent,标题:{x-csrf-token:Required set cookie:sap usercontext=sap client=100;path=/set cookie:MYSAPSSO2=AJQXMDMBabHtafMarqboaeCavacQaQaQaQaQaQaGaaCaiaAyxadaamadababaaQaQaQaQaQaQaQaQaQaQaQaQaQaGaaCaaAaQaAaQaQaAaAaQaQaQaAaQaAaQaQaQaQaQaQaAaQaQaQaQaQaQaQaQaQaQaQaQaQaAaQaQaQaAaAaAaAaAaOimambmakgbssoawaiabaqcgxtaybgkqhkig9w0bcqmxcwyjkozihvcnaqcbmbwgcsqgsib3dqejbtepw0xnza5mdeym4mtbamcmgcsqgsib3dqejbdewbbrsjqhrlpcsnxyjzsrqj/rOgo/g2tajbgbgcqhjjooaqdbc8wlqiuxjws4bw63uldwr!NB9r9XUCD54CFQCH6y91A!uKMzyfZEo7pvxjXys6zg==;路径=/;域=。mindsetconsulting。com set cookie:SAP_SESSIONID_GW1_100=Zvfe5ueHO1md7_ybPcLEcnem3m6PVRHnvP4KDkBCwEk=;path=/access control allow credentials:true access control allow标头:*access control allow origin:*。谷歌。com访问控制允许方法:*内容长度:28内容类型:文本/普通;charset=utf-8}系统。网Http。HttpResponseMessage

共有1个答案

仲浩旷
2023-03-14

我发现了问题。我必须收集cookie和csrf令牌,并在实际的POST方法中应用这些cookie。那起作用了。

拿到饼干后再拿

                    Uri uri = new Uri(_URI);
                    _responseCookies = cookies.GetCookies(uri).Cast<Cookie>();

然后把饼干加到帖子里

        CookieContainer cookieContainer = new CookieContainer();
        foreach (var cookie in _responseCookies)
        {
            cookieContainer.Add(new Uri(_URI), cookie);
        }
HttpClientHandler handler = new HttpClientHandler() { CookieContainer = cookieContainer };
 类似资料:
  • 在angular文档中,提到angular将在post请求的头中自动发送cookie的值。文档链接 但它没有为我发送标题。这是我的密码 Nodejs用于设置cookie的代码 我在app.module.ts中使用了http客户端 **以上代码仅用于调试目的。我没有set-csrf终结点。 但是当我发送帖子请求时,它不会发送任何标题。我不能调试。 我也在angular的github存储库中添加了这个

  • 我试图张贴使用ajax在laravel 5.我得到CSRF令牌不匹配异常。我环顾四周,发现可能存在这样的问题,但在这种情况下,我确实包括了所有必要的代码。 请看一下我的代码。 看法 我已经在隐藏输入中提供了令牌,并将其包含在我的帖子中。 我有一个元在头如下。 下面是我的控制器。 这个只是测试用的,这里没什么。我的路线如下 请帮我解决这个问题 这是日志中的输出。 以下是我的浏览器控制台帖子标题和页面

  • 我在Spring框架中有csrf保护。所以在每个请求中,我都从ajax调用中发送csrf令牌,这是完美的工作。 在ajax

  • 我有一个配置了优雅关机的SpringBoot项目。部署在k8s这是日志, 应用程序已从库伯内特斯收到处的。根据Pods表示终止Pod已从服务的endpoint列表中删除,但它与发送信号后转发请求17秒(直到)相矛盾。是否缺少任何配置? 优雅关机 部署文件 更新时间: 添加了自定义健康检查endpoint 更改了livenessProbe, 这是更改后的日志, 使用3次故障的livenessProb

  • 我们有一个带有Angular 2的Spring启动应用程序,对于身份验证,我们使用JWT。我遇到了一个问题——即使令牌已经过期,然后注销并再次登录,过期的JWT令牌仍然在请求标头上可用。因此后端仍然验证旧的JWT令牌,而不是新令牌。我需要清除浏览器缓存使其工作。 我看到令牌存储在Sessionstore中,下面的操作也是为了在上清除令牌 但这也不是清除旧令牌。我可以做些什么来从浏览器中清除令牌?

  • 我正在通过在WebSocketClientFlow上遵循doc来尝试客户端websocket。