【问题标题】:.NET HttpWebRequest oAuth 401 Unauthorized.NET HttpWebRequest oAuth 401 未经授权
【发布时间】:2012-12-20 18:26:32
【问题描述】:

我需要使用 VB.NET 应用程序中的 Web 资源。我已成功检索到访问令牌并准备使用它来调用受保护的资源。但是,每次调用受保护资源时,我都会收到 401 Unauthorized 响应,因为 Authorization 字段尚未添加到标头中。

这是我的代码。

WebRequest = DirectCast(Net.WebRequest.Create(ApiUri), HttpWebRequest)
WebRequest.Method = "POST"
WebRequest.ContentType = "application/json"
WebRequest.ContentLength = Bytes.Length
Dim RequestStream As IO.Stream = WebRequest.GetRequestStream
RequestStream.Write(Bytes, 0, Bytes.Length)
RequestStream.Close()
WebRequest.Headers("Authorization") = "OAuth " & _
                                      "oauth_version=""1.0""," & _
                                      "oauth_nonce=""" & Nonce & """," & _
                                      "oauth_timestamp=""" & TimeStamp & """," & _
                                      "oauth_consumer_key=""" & ConsumerKey & """," & _
                                      "oauth_token=""" & Token & """," & _
                                      "oauth_signature_method=""HMAC-SHA1""," & _
                                      "oauth_signature=""" & Signature & """"
WebResponse = DirectCast(WebRequest.GetResponse(), HttpWebResponse)

然后我使用 Fiddler 监控请求。我在 Fiddler 中看到的只是带有 401 响应的请求,如下所示(不包括正文)。

请求

POST ***url*** HTTP/1.0
Content-Type: application/json
Host: ***host***
Content-Length: 45
Connection: Keep-Alive

回应

HTTP/1.0 401 Unauthorized
X-Powered-By: PHP/5.3.13
WWW-Authenticate: Basic realm="***realm***"
Content-type: application/json
Content-Length: 79
Connection: keep-alive
Date: Mon, 07 Jan 2013 01:13:22 GMT
Server: lighttpd/1.4.28

我在互联网上读到的任何地方都表明 HttpWebRequest 应该首先挑战服务器并收到 401 响应,正如我在这里看到的那样。然后它应该再次尝试将 Authorization 字段添加到标头并获得 200 OK 响应。这第二部分不会发生。我不明白这是如何正常工作的,还是我做错了什么?

【问题讨论】:

  • 考虑使用现有的 oAuth 库 (oauth.net/code)。手工操作可能会让你发疯。
  • 感谢您的回复。我已经在使用该站点的代码。我实际上让整个 oAuth 舞蹈正常工作。那不是问题。我不相信这个问题甚至与 oAuth 相关(为了完整起见,我只是将它包含在帖子中)。我认为这个问题与 HttpWebRequest 以及它与服务器的通信方式有关。
  • 好吧,我没有在 WebRequest 中指定一个,所以我相信它只是使用了一些默认设置,就像 IE 使用的一样。我应该将 WebRequest.Proxy 设置为什么吗?
  • 当然不会有什么坏处。 “Dim lvWebProxy As IWebProxy = WebRequest.GetSystemWebProxy()”,然后是“lvWebProxy.Credentials = System.Net.CredentialCache.DefaultCredentials”
  • 谢谢,但很遗憾,这并不能解决问题。

标签: .net vb.net oauth httpwebrequest authorization


【解决方案1】:

原来你需要使用 BinaryWriter 添加内容,而不是 Stream。

所以不是这个。

WebRequest.ContentLength = Bytes.Length
Dim RequestStream As IO.Stream = WebRequest.GetRequestStream
RequestStream.Write(Bytes, 0, Bytes.Length)
RequestStream.Close()

这样做。

Using Writer As New IO.BinaryWriter(WebRequest.GetRequestStream)
    Writer.Write(Bytes)
End Using

【讨论】:

  • 我认为在 GetRequestStream 之前添加您的标头也可以。
猜你喜欢
  • 1970-01-01
  • 2012-04-08
  • 2017-09-27
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
相关资源
最近更新 更多