如何强制 WebRequest 在 POST 请求时发送授权头信息

38
当使用WebRequest发送POST请求时,即使我已经手动设置了Authorization头并将PreAuthenticate设置为true,该头也不会被随请求一起发送。
webRequest.Headers["Authorization"] = "OAuth oauth_consumer_key=bFPD...";
webRequest.PreAuthenticate = true;
使用 Fiddler 我可以看到 Authorization 标头没有被发送。目标站点(Twitter)返回 400(错误请求),而不是 401(未授权),这是 WebRequest 发送 Authorization 数据所需要的正确挑战。为了提供信息,返回的内容如下:

使用 Fiddler 我能看到 Authorization 标头未被发送。目标站点(Twitter)返回的状态码是 400(错误请求),而不是应该的 401(未授权),因此无法成功发送 Authorization 数据。值得注意的是,返回的内容如下:

{"errors":[{"message":"Bad Authentication data","code":215}]}

那么,我该怎么解决这个问题呢?如何强制 WebRequest 在初始请求中发送授权信息?请注意,授权数据不是基本认证,而是 OAuth 字符串。

谢谢


请参考这个问题 - Steve Kehlet
4个回答

74

这是我的解决方案。变量json中存储了该值。

var myUri = new Uri(fullpath);
var myWebRequest = WebRequest.Create(myUri);
var myHttpWebRequest = (HttpWebRequest)myWebRequest;
myHttpWebRequest.PreAuthenticate = true;
myHttpWebRequest.Headers.Add("Authorization", "Bearer " + AccessToken);
myHttpWebRequest.Accept = "application/json";

var myWebResponse = myWebRequest.GetResponse();
var responseStream = myWebResponse.GetResponseStream();
if (responseStream == null) return null;

var myStreamReader = new StreamReader(responseStream, Encoding.Default);
var json = myStreamReader.ReadToEnd();

responseStream.Close();
myWebResponse.Close();

myUri在前一行被创建。只需发送完整的网址。 - JuanPablo
我漏掉了 myHttpWebRequest.PreAuthenticate = true; 这一行。谢谢,即使我们添加了身份验证头部,没有它似乎也无法工作。 - FindOutIslamNow
1
请为我工作。谢谢! - Abner Escócio

9

我简直不敢相信!你太厉害了……所有复杂的答案,这才是真正的答案!谢谢你。 - CodeHacker

3
尝试这个,但是授权标头之间不应该有空格。
var authHeader = "OAuth  oauth_consumer_key=bFPD...";
webRequest.Headers.Add("Authorization", authHeader);

1
那不起作用(我认为它与上面的代码具有完全相同的效果)。请注意,授权标头是正确的(带有空格),因为它可以在GET中工作,但不能在POST中工作。 - chris

0

我的解决方案

                var request = WebRequest.Create(requestUri);

                System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
                
                request.ContentType = "application/json";
                request.Method = "GET";
                request.Headers.Add("Authorization", "Bearer " + Token);

                var type = request.GetType();
                var currentMethod = type.GetProperty("CurrentMethod", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(request);

                var methodType = currentMethod.GetType();
                methodType.GetField("ContentBodyNotAllowed", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(currentMethod, false);

                using (var streamWriter = new StreamWriter(request.GetRequestStream()))
                {
                    streamWriter.Write(JsonConvert.SerializeObject(Entity));
                }

                var response = request.GetResponse();
                var responseStream = response.GetResponseStream();
                if (responseStream != null)
                {
                    var myStreamReader = new StreamReader(responseStream, Encoding.Default);
                    var resultEntity= myStreamReader.ReadToEnd();
                    myStreamReader.ReadToEnd());
                }
                responseStream.Close();
                response.Close();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接