53

我正在集成将使用 HTTP-POST 来请求和检索数据的 Web 服务。远程服务器需要根据 RFC 2617 进行基本身份验证

我的身份验证尝试失败了。

它失败了,即使我将'NetworkCredential'对象附加到'HttpWebRequest'对象的'Credentials'属性,即使我设置'PreAuthenticate' = true,也不会在标头中发送身份验证信息。

我错过了什么?

//使用的块

NetworkCredential netCredential = new NetworkCredential(" uid", "pwd");

Uri uri = new Uri("http://address of services");

ICredentials credentials = netCredential.GetCredential(uri, "Basic");

objRegistration.Credentials = credentials;

objRegistration.PreAuthenticate = true;
4

4 回答 4

117

我刚刚发现这个非常方便的小代码块可以完全满足您的需求。它手动将授权标头添加到代码中,而无需等待服务器的质询。

public void SetBasicAuthHeader(WebRequest request, String userName, String userPassword)
{
    string authInfo = userName + ":" + userPassword;
    authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
    request.Headers["Authorization"] = "Basic " + authInfo;
}

像这样使用它

var request = WebRequest.Create("http://myserver.com/service");
SetBasicAuthHeader(request, userName, password);

var response = request.GetResponse();
于 2010-07-16T15:32:28.520 回答
8

对 samuel-jack 接受的答案进行了一些改进。应该使用此答案中提到的默认编码“ISO-8859-1”,而不是使用 HTTP 基本身份验证我应该使用哪种编码?

所以代码看起来像这样:

public void SetBasicAuthHeader(WebRequest request, String userName, String userPassword)
{
    string authInfo = userName + ":" + userPassword;
    authInfo = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(authInfo));
    request.Headers["Authorization"] = "Basic " + authInfo;
}
于 2015-12-17T16:54:07.470 回答
4

我在寻找答案时发现了这个问题,给出的答案有效但不灵活,所以如果你想要更好的 .NET 方式来做到这一点。

Uri uri = new Uri("http://address of services");

HttpWebRequest objRegistration = (HttpWebRequest)WebRequest.Create(url);

CredentialCache credentials = new CredentialCache(); 

NetworkCredential netCredential = new NetworkCredential(" uid", "pwd");

credentials.Add(uri, "Basic", netCredential);

objRegistration.Credentials = credentials;

您可以将“Basic”替换为“Digest”、“NTLM”或“Negotiate”,这样也可以将多种类型添加到缓存中。

于 2015-05-07T12:16:54.397 回答
3

这是我的 OAuth 解决方案。该值在变量 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();
于 2015-02-08T01:36:28.937 回答