我正在集成将使用的Web服务 HTTP-POST请求和检索数据。远程服务器 需要根据RFC 2617进行基本身份验证
我的身份验证尝试失败了。
它失败了,即使我将'NetworkCredential'对象附加到'HttpWebRequest'对象的'Credentials'属性,也不会在标头中发送身份验证信息, 即使我设置'PreAuthenticate'= true。
我错过了什么?
// chunk used
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;
答案 0 :(得分:112)
我刚刚发现这个非常方便的小chunk of code来完全按照你的需要做。它会手动将授权标头添加到代码中,而无需等待服务器的质询。
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();
答案 1 :(得分:7)
改善samuel-jack接受的答案。而不是使用默认编码" ISO-8859-1"应该按照这个答案中提到的那样使用What encoding should I use for HTTP Basic Authentication?
所以代码看起来像这样:
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;
}
答案 2 :(得分:3)
我在寻找答案时发现了这个问题,给出的答案有效,但不灵活,所以如果你想要一个更好的.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”以及此功能,这样就可以将多种类型添加到缓存中。
答案 3 :(得分:2)
这是我对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();