使用 HttpWebRequest (.NET) 处理身份验证

3
我将从VB应用程序访问REST webservice。我创建了一个HttpWebResponse对象并调用它上面的GetRequestStream方法,但是在调用GetResponse时,抛出了401异常。
以下是我的代码(修改后发布):
Dim webRequest = DirectCast(WebRequest.Create(endpoint), HttpWebRequest)
webRequest.Method = "POST"
webRequest.ContentLength = contentLength
webRequest.ContentType = "application/x-www-form-urlencoded"

request.Credentials = New NetworkCredential(Username, Password)

' Works fine
Using stream As Stream = webRequest.GetRequestStream()
    stream.Write(data, 0, data.Length)
End Using

' Barfs
Dim response As HttpWebResponse = DirectCast(webRequest.GetResponse(), HttpWebResponse)

当我调用“webRequest.GetResponse()”时,立即出现401异常。响应中有一个“WWW-Authenticate”头,带有适当的领域信息。我尝试设置“webRequest.PreAuthenticate = True”,以及手动使用“webRequest.Headers.Add(HttpRequestHeader.Authorization, _authheader)”设置头文件,但没有成功。

由于这是SSL流量,因此似乎无法使用Fiddler / Wireshark等工具监视这些请求。我确定有一种方法可以监视它,只是我还没有找到。

提前感谢您的帮助,

--Connor

4个回答

3

尝试手动添加AUTHORIZATION头,例如...

string autorization = userName + ":" + password;
byte[] binaryAuthorization = System.Text.Encoding.UTF8.GetBytes(autorization);
autorization = Convert.ToBase64String(binaryAuthorization);
autorization = "Basic " + autorization;
webRequest.Add("AUTHORIZATION", autorization);

这在过去对我很有效,当设置凭据属性失败时。

简直不敢相信我竟然不得不手动添加授权头才能让我的网络请求正常工作,但是当 request.Credentials = New NetworkCredential(Username, Password) 无效时它却奏效了。由于我使用的是 HttpWebRequest,所以我使用 request.Headers.Add("AUTHORIZATION", authorization); 添加了授权头。 - cwadding


1
谢谢大家的帮助!问题在于我被重定向了!我觉得我需要做的就是更改地址头以反映成功完成帖子后将被重定向到的URL。

0

这当然可能不是你的问题,但我过去曾遇到过通过设置解决的身份验证问题。

request.ProtocolVersion = HttpVersion.Version10

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