2010-05-04 15 views
47

में बुनियादी प्रमाणीकरण जबरदस्ती मैं वेब सेवा अनुरोध करने के लिए एक HTTP-पोस्ट का उपयोग करें और डेटा पुनः प्राप्त होगा एकीकृत कर रहा। दूरस्थ सर्वर प्रति RFC 2617WebRequest

प्रमाणित करने के लिए असफल रहे हैं मेरे प्रयास के रूप में बुनियादी प्रमाणीकरण की आवश्यकता है।

ऐसा नहीं है कि में विफल रहता है, भले ही मैं एक 'HttpWebRequest' वस्तु की 'साख' संपत्ति के लिए एक 'NetworkCredential' वस्तु देते हैं, कोई प्रमाणीकरण जानकारी शीर्षक में भेज दिया जाता है, भले ही मैं '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' प्रॉपर्टी इंगित करता है कि सर्वर_ द्वारा चुनौती देने के इंतजार किए बिना ** बाद के ** अनुरोधों के साथ प्रमाणीकरण जानकारी भेजना है, और ['HttpWebRequest.PreAuthenticate'] (http://msdn.microsoft.com/en-us/library/ system.net.httpwebrequest.preauthenticate (v = vs.110) .aspx): ** के बाद ** एक विशिष्ट उरी के लिए आने के लिये ग्राहक के अनुरोध है सफलतापूर्वक प्रमाणीकृत यदि 'PreAuthenticate' सच ..._ – Sepster

उत्तर

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

वहाँ एक बेहतर तरीका हो सकता है लगता है, लेकिन मैं इसके लिए वैसे भी मतदान होगा;) –

+0

यह सही जवाब है, मैं न पता है कि हिमांशु के बारे में बात कर रहा है। – cgatian

+0

लेकिन यह इसके बिना क्यों काम नहीं करेगा? – Vedran

2

की तरह इसका इस्तेमाल यहाँ OAuth के लिए मेरे समाधान है। मान परिवर्तनीय जेसन में है।

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

मैं इस सवाल का जवाब मिल गया है, जबकि की तलाश में, जवाब दिया काम करता है लेकिन इसलिए यदि आप ऐसा करने का एक बेहतर नेट रास्ता चाहते हैं लचीला नहीं है।

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

मैं यह नहीं कहूंगा कि यह विधि अधिक लचीला है , या एक बेहतर नेट तरीका। CredentialCache में प्रमाणीकरण प्रकार और प्रमाण-पत्र सेट करना सीधे "प्राधिकरण" शीर्षलेख को प्रभावित/सेट नहीं करता है। क्रेडेंशियल कैश सेट करना ऊपर वर्णित स्थिति में मदद नहीं करेगा (जब सर्वर से कोई चुनौती/401 स्टेटस कोड नहीं है।)। – Denis

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