.net with 在WebRequest中強制執行基本身份驗證




webrequest create (4)

我正在集成將使用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;

這是我的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();

改善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;
}

我在尋找答案時發現了這個問題,給出的答案有效,但不靈活,所以如果你想要一個更好的.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”以及此功能,從而可以將多種類型添加到緩存中。


我剛剛發現這個非常方便的小塊代碼可以完全滿足您的需求。 它會手動將授權標頭添加到代碼中,而無需等待服務器的質詢。

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();




webrequest