2010-05-04 69 views
47

我正在集成將使用HTTP-POST請求和檢索數據的Web服務。遠程服務器 需要根據RFC 2617在WebRequest中強制執行基本身份驗證

進行基本身份驗證我的身份驗證嘗試失敗。

即使我將「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; 
+3

從MSDN:['WebRequest.PreAuthenticate'] (http://msdn.microsoft.com/en-us/library/system.net.webrequest.preauthenticate(v=vs.110).aspx):**除第一個請求** _之外, PreAuthenticate'屬性表示是否發送帶**後續**請求的認證信息而不等待server_和['HttpWebRequest.PreAuthenticate'](http://msdn.microsoft.com/en-us/library/ system.net.httpwebrequest.preauthenticate(v = vs.110).aspx):** ** _a客戶端請求到特定的Uri後如果'PreAuthenticate'確實成功驗證..._ – Sepster 2014-09-14 14:20:11

回答

107

我剛剛發現這非常方便的小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(); 
+0

好像還有更好的方法,但我會爲它投票;) – 2011-11-28 14:40:46

+0

這是正確的答案,我不知道Himanshu在說什麼。 – cgatian 2012-01-19 15:19:32

+0

但是如果沒有這個,爲什麼不行? – Vedran 2012-08-28 09:27:17

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

我發現這個問題,同時尋找答案,答案給出的作品,但不靈活,所以如果你想這樣做的更好的方式.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; 

你可以用「文摘」,「NTLM」或「協商」,以及這給多種類型添加到緩存以及能力取代「基本」。

+0

我不會說這種方法更靈活,或者更好的.Net方式。在CredentialCache中設置身份驗證類型和憑證似乎不直接影響/設置「授權」頭。設置CredentialCache將無助於上述情況(當服務器沒有挑戰/ 401狀態碼時)。 – Denis 2017-07-13 23:48:10

7

改善塞繆爾傑克接受的答案。不使用默認的編碼「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; 
}