2011-01-12 20 views
25

मैं जानना चाहता हूं कि मेरा एएसपीनेट एप्लिकेशन मेरे पोस्ट में हेडर क्यों नहीं जोड़ता है जब इसे 'प्राधिकरण' नाम दिया जाता है लेकिन जब मैं एक चरित्र बदलता हूं, तो "प्राधिकरण" कहता है, ठीक काम करेगा। अन्य साइटों के लिए प्रलेखन में वे हमेशा "प्राधिकरण" नाम का उपयोग करते हैं, इसलिए मैं भी साथ चाहूंगा और इस बिंदु पर मैं बस खड़े रहना चाहता हूं क्यों।एएसपी.नेट HTTP प्रमाणीकरण शीर्षलेख

मैंने इसके बारे में कुछ विषय पढ़े हैं लेकिन मुझे कोई तर्कसंगत कारण नहीं मिला है।

यहाँ नीचे मेरी कोड है:

string fileName = "c:\\xyz.xml"; 
string uri = "http://myserver/Default.aspx"; 
req = WebRequest.Create(uri); 
req.Method = "POST"; 
req.ContentType = "text/xml"; 
byte[] authBytes = Encoding.UTF8.GetBytes("DDSServices:jCole2011".ToCharArray()); 
req.Headers.Add("Authorization", "BASIC " + Convert.ToBase64String(authBytes)); 
req.Headers.Add("test", "test"); 
UTF8Encoding encoder = new UTF8Encoding(); 
byte[] data = encoder.GetBytes(this.GetTextFromXMLFile(fileName)); 
req.ContentLength = data.Length; 
Stream reqStream = req.GetRequestStream(); 
reqStream.Write(data, 0, data.Length); 
reqStream.Close(); 
req.Headers.Add("Authorization", "BASIC" + Convert.ToBase64String(authBytes)); 
System.Net.WebResponse response = req.GetResponse(); 
System.IO.StreamReader reader = new StreamReader(response.GetResponseStream()); 
string str = reader.ReadToEnd(); 

अन्य कष्टप्रद इस जब मैं Fiddler के माध्यम से देखा चर जोड़ने यह ठीक काम करता है है।

उत्तर

11

HTTP मूल प्रमाणीकरण के लिए, आपको प्रमाण-पत्र संपत्ति का उपयोग करना चाहिए।

req.Credentials = new NetworkCredential("DDSServices", "jCole2011");

यह आप क्या चाहते हैं क्या करना चाहिए। प्राधिकरण शीर्षलेख सेट करने के बजाय।

+0

या है वहाँ एक तार्किक कारण? एक बहुत बड़ी तीसरी पार्टी कंपनी जिसके साथ हम काम करते हैं, उसी तरह उनके प्रमाणीकरण के साथ दस्तावेज है, इसलिए मैं कारण जानना चाहता हूं। – Cody

+1

नेटवर्क क्रेडेंशियल दृष्टिकोण का उपयोग करना बेहतर होगा जैसा कि सुझाव देगा। हालांकि, आपके दृष्टिकोण को भी ठीक काम करना चाहिए, हालांकि मुझे समझ में नहीं आ रहा है कि आप इसे दो बार क्यों कर रहे हैं (GetRquestStream पर कॉल करने से पहले एक बार, और एक बार बाद। आपको इसे एक बार पहले प्राप्त करना चाहिए y कहां GetRequestStream। अगर यह अभी भी काम नहीं करता है, तो एक प्राप्त करें ट्रेस लॉग। निर्देश http://ferozedaud.blogspot.com/2009/08/tracing-with-systemnet.html – feroze

+0

क्या आप मुझे बता सकते हैं कि यह बेहतर क्यों है? या जहां मैं पढ़ सकता हूं कि यह बेहतर क्यों है? मेरे लिए ऐसा लगता है कि नेटवर्क क्रेडेंशियल्स को विज्ञापन या फॉर्म प्रमाणीकरण के साथ बंधेगा, मैं कनेक्शन को अज्ञात के माध्यम से दूंगा, फिर बस सत्यापित करें। किसी भी तरह से हालांकि कोई मुझे बता सकता है क्यों? मुझे इस बारे में परवाह नहीं है कि इस बिंदु पर क्या है। – Cody

3

नेटवर्क क्रेडेंशियल एक अच्छा समाधान है, लेकिन जिस साइट पर आप कॉल कर रहे हैं उसे प्रतिक्रिया में 401 और एक डब्ल्यूडब्ल्यूडब्ल्यू-प्रमाणीकरण शीर्षलेख के साथ अनधिकृत संभालना है।

ग्राहक:

request.Credentials = new CredentialCache {{aUri, "Basic", new NetworkCredential(aUserName, aPassword)}}; 

सर्वर:

Response.ClearContent(); 
Response.StatusCode = 401; 
Response.AddHeader("WWW-Authenticate", "Basic"); 
Response.End(); 

इस सर्वर के लिए 2 हिट का परिणाम देगा। प्रारंभिक कॉल बिना प्रमाण पत्र के सर्वर पर जाएगा। जब सर्वर 401 और WWW- प्रमाणीकरण शीर्षलेख (प्रमाणीकरण के प्रकार के साथ) के साथ प्रतिक्रिया करता है, तो अनुरोध अनुरोध में प्रमाण-पत्रों से नाराज होगा।

+3

यह सच है, लेकिन 401 अनधिकृत वापस भेज रहा है, और WWW- प्रमाणीकरण शीर्षलेख HTTP स्पेक का हिस्सा है। यदि आप पहले अनुरोध पर हेडर भेजने को मजबूर करना चाहते हैं, तो आप प्रीएट प्रमाणीकरण विधि के माध्यम से ऐसा कर सकते हैं। अतिरिक्त में - आईआईएस स्वचालित रूप से इस प्रतिक्रिया को वापस भेजता है, जैसे अपाचे जैसे अन्य अच्छी तरह से लिखित HTTP सर्वर करते हैं। ब्राउजर को पासवर्ड प्रॉम्प्ट संवाद प्रदर्शित करने के बारे में पता है। –

41

मैं एक प्रश्न में भाग गया था कि हेडर को प्रमाणीकरण/प्रमाण-पत्र कैसे जोड़ें। मुझे निम्नलिखित तरीके से समाधान मिला।

string _auth = string.Format("{0}:{1}", "myUser","myPwd"); 
string _enc = Convert.ToBase64String(Encoding.ASCII.GetBytes(_auth)); 
string _cred = string.Format("{0} {1}", "Basic", _enc); 
req.Headers[HttpRequestHeader.Authorization] = _cred; 

कौन सा मुझे उन हेडर मैं चाहता हूँ (चिपकाया Wireshark विवरण) दिया था,

प्राधिकरण: बेसिक bXlVc2VyOm15UHdk \ r \ n
साख: MyUser: myPwd

+0

तो आप यह सुनिश्चित करने के लिए कैसे जानते हैं कि उपयोग करने के लिए एन्कोडिंग ASCII है? –

+1

अच्छा बिंदु। चुनिंदा एन्कोडिंग संभावित "हार्ड टू खोजने" की तरह दिखता है-बग के लिए स्रोत। मैं लिंक जोड़ने के बारे में अधिक जानकारी प्राप्त करने के लिए पाठकों के लिए http://stackoverflow.com/questions/7242316/what-encoding-should-i-use-for-http-basic- प्रमाणीकरण लिंक जोड़ता हूं। – Independent

संबंधित मुद्दे