从.NET HttpWebRequest发布到API时禁止使用403

2020-08-25 18:25发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


第一种方法:从GET_API_URL获取CSRF令牌字符串。 效果很好。

第二种方法:使用获取的CSRF字符串对POST_API_URL进行POST。

问题是,无论我尝试了什么,它始终会收到403 Forbidden错误。 尝试将第一个响应的cookie(3个cookie-2个安全)存储到Cookie容器中,然后将其传递给第二个请求。 还是没有运气...

在POSTman上尝试了相同的连接,一切正常。 只是不在C#中。

 HttpWebRequest req =(HttpWebRequest)WebRequest.Create(" https://mysap_get-api.s4hana.ondemand.com/blablabla");
         req.Proxy = null;
         req.Method =" GET";
         req.Headers [" X-CSRF-Token"] ="获取";
         req.Headers [" Authorization"] ="基本" + Convert.ToBase64String(Encoding.Default.GetBytes(auth_key));
         req.CookieContainer = cookieContainer;

         HttpWebResponse response = req.GetResponse()as HttpWebResponse;
         字符串csrf = response.GetResponseHeader(" x-csrf-token");


         如果(!string.IsNullOrEmpty(csrf))
         {
             尝试
             {
                 HttpWebRequest post_req =(HttpWebRequest)WebRequest.Create(" https://mysap_post-api.s4hana.ondemand.com/blablabla");
                 post_req.Proxy = null;
                 post_req.Method ="开机自检";
                 post_req.ContentType =" application/json";
                 post_req.Headers [" APIKey"] = api_key;
                 post_req.Headers [" X-CSRF-Token"] = csrf;
                 post_req.Headers [" Authorization"] ="基本" + Convert.ToBase64String(Encoding.Default.GetBytes(auth_key));
                 post_req.Accept =" text/xml";
                 post_req.CookieContainer = cookieContainer;

                //也尝试过-没有运气
                //foreach(Cookie _cookie在response.cookies中)
                //{
                //cookieContainer.Add(new cookie
                //{
                //名称= _cookie.Name,
                //值= _cookie.Value,
                //安全= _cookie.Secure,
                //域=" mysap_post-api.s4hana.ondemand.com"
                //});
                //}

                //附加json主体
                 JavaScriptSerializer js =新的JavaScriptSerializer();
                 字符串_hourJson = js.Serialize(_hour);
                 var data = Encoding.ASCII.GetBytes(_hourJson);
                 使用(var post_reqStream = post_req.GetRequestStream())
                 {
                     post_reqStream.Write(data,0,data.Length);
                 }

                //发布第二个请求并检索结果
                 字符串结果;
                 ***这将继续提供403 !!! ***
                 使用(WebResponse post_response = post_req.GetResponse())
                 {
                     使用(StreamReader rd = new StreamReader(post_response.GetResponseStream()))
                     {
                         结果= rd.ReadToEnd();
                     }
                 }

             }
             抓住(前例外)
             {

             }
         }
         其他
         {
             Debug.WriteLine("无效的CSRF令牌,作业已终止");
         }
 

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


第一种方法:从GET_API_URL获取CSRF令牌字符串。 效果很好。

第二种方法:使用获取的CSRF字符串对POST_API_URL进行POST。

问题是,无论我尝试了什么,它始终会收到403 Forbidden错误。 尝试将第一个响应的cookie(3个cookie-2个安全)存储到Cookie容器中,然后将其传递给第二个请求。 还是没有运气...

在POSTman上尝试了相同的连接,一切正常。 只是不在C#中。

 HttpWebRequest req =(HttpWebRequest)WebRequest.Create(" https://mysap_get-api.s4hana.ondemand.com/blablabla");
         req.Proxy = null;
         req.Method =" GET";
         req.Headers [" X-CSRF-Token"] ="获取";
         req.Headers [" Authorization"] ="基本" + Convert.ToBase64String(Encoding.Default.GetBytes(auth_key));
         req.CookieContainer = cookieContainer;

         HttpWebResponse response = req.GetResponse()as HttpWebResponse;
         字符串csrf = response.GetResponseHeader(" x-csrf-token");


         如果(!string.IsNullOrEmpty(csrf))
         {
             尝试
             {
                 HttpWebRequest post_req =(HttpWebRequest)WebRequest.Create(" https://mysap_post-api.s4hana.ondemand.com/blablabla");
                 post_req.Proxy = null;
                 post_req.Method ="开机自检";
                 post_req.ContentType =" application/json";
                 post_req.Headers [" APIKey"] = api_key;
                 post_req.Headers [" X-CSRF-Token"] = csrf;
                 post_req.Headers [" Authorization"] ="基本" + Convert.ToBase64String(Encoding.Default.GetBytes(auth_key));
                 post_req.Accept =" text/xml";
                 post_req.CookieContainer = cookieContainer;

                //也尝试过-没有运气
                //foreach(Cookie _cookie在response.cookies中)
                //{
                //cookieContainer.Add(new cookie
                //{
                //名称= _cookie.Name,
                //值= _cookie.Value,
                //安全= _cookie.Secure,
                //域=" mysap_post-api.s4hana.ondemand.com"
                //});
                //}

                //附加json主体
                 JavaScriptSerializer js =新的JavaScriptSerializer();
                 字符串_hourJson = js.Serialize(_hour);
                 var data = Encoding.ASCII.GetBytes(_hourJson);
                 使用(var post_reqStream = post_req.GetRequestStream())
                 {
                     post_reqStream.Write(data,0,data.Length);
                 }

                //发布第二个请求并检索结果
                 字符串结果;
                 ***这将继续提供403 !!! ***
                 使用(WebResponse post_response = post_req.GetResponse())
                 {
                     使用(StreamReader rd = new StreamReader(post_response.GetResponseStream()))
                     {
                         结果= rd.ReadToEnd();
                     }
                 }

             }
             抓住(前例外)
             {

             }
         }
         其他
         {
             Debug.WriteLine("无效的CSRF令牌,作业已终止");
         }
 
付费偷看设置
发送
1条回答
Climb_Ma
1楼-- · 2020-08-25 19:06

Alec-您是否找到了解决方案,因为我遇到的问题完全相同。

一周热门 更多>