2012-04-18 23 views
7

मैं एक मौजूदा नेट फिर से लिखें बाकी एपीआई का उपयोग कर (मूल रूप से रूबी के साथ लिखा) करने के लिए हो रहा है। ग्राहक के परिप्रेक्ष्य से, इसे पुराने एपीआई के समान ही काम करना होगा - यानी क्लाइंट कोड को बदलने की आवश्यकता नहीं है। मौजूदा एपीआई को मूल प्रमाणीकरण की आवश्यकता है। तो पुराने एपीआई कॉल करने के लिए, निम्नलिखित पूरी तरह से काम करता है: -ASP.Net वेब एपीआई - प्राधिकरण हैडर खाली

 var wc = new System.Net.WebClient(); 
     var myCache = new CredentialCache(); 
     myCache.Add(new Uri(url), "Basic", new NetworkCredential("XXX", "XXX")); 
     wc.Credentials = myCache; 
     var returnBytes = wc.DownloadData("http://xxxx"); 

(मैं वास्तविक URL/उपयोगकर्ता नाम/पासवर्ड सुरक्षा कारणों आदि ommit करना पड़ा है)।

अब मैं MVC4 साथ ASP.Net वेब एपीआई का उपयोग कर नए एपीआई लिख रहा हूँ। मुझे एक अजीब समस्या है और एक ही समस्या के साथ किसी और को नहीं मिल सकता है। आदेश बेसिक प्रमाणीकरण का समर्थन करने के लिए, मैं यहाँ दिशा निर्देशों का पालन किया है:

http://sixgun.wordpress.com/2012/02/29/asp-net-web-api-basic-authentication/

एक बात है, मैं कोड डालने के लिए Application_Start में Global.asax.cs फ़ाइल में "हैंडलर में हुक"() घटना (जिसे समझाया नहीं गया था इसलिए मैंने अनुमान लगाया)।

वैसे भी, अगर मैं उपर्युक्त कोड का उपयोग करके अपना एपीआई (जिसे मैंने आईआईएस में तैनात किया है) कहते हैं, तो प्राधिकरण शीर्षलेख हमेशा शून्य होता है, और उपरोक्त 401 अनधिकृत के साथ विफल रहता है। हालांकि, अगर मैं मैन्युअल रूप से इस कोड का उपयोग करके हेडर सेट करता हूं, तो यह ठीक काम करता है - यानी प्राधिकरण शीर्षलेख अब मौजूद है और मैं उपयोगकर्ता को प्रमाणीकृत करने में सक्षम हूं।

private void SetBasicAuthHeader(WebClient request, String userName, String userPassword) 
    { 
     string authInfo = userName + ":" + userPassword; 
     authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); 
     request.Headers["Authorization"] = "Basic " + authInfo; 
    } 
    ....... 
    var wc = new System.Net.WebClient(); 
    SetBasicAuthHeader(request, "XXXX", "XXXX"); 
    var returnBytes = wc.DownloadData("http://xxxx"); 

हालांकि यह काम करता है, यह मेरे लिए अच्छा नहीं है क्योंकि मौजूदा एपीआई के मौजूदा उपयोगकर्ता मैन्युअल रूप से हेडर सेट नहीं करेंगे।

कैसे मूल प्रमाणीकरण काम करता है पर पढ़ना, प्रारंभिक अनुरोध गुमनाम करने के लिए है, तो ग्राहक 401 लौटा दिया जाता है, तो ग्राहक फिर से कोशिश करने के लिए है। हालांकि अगर मैं अपने कोड में ब्रेक पॉइंट डालता हूं, तो यह एंटनी के उदाहरण में फिर से कोड को हिट नहीं करेगा। मैं अपने ब्रेकपॉइंट को दो बार मारने की उम्मीद कर रहा था।

कोई भी विचार कैसे मैं इस काम करने के लिए मिल सकता है?

उत्तर

9

आप सही व्यवहार की उम्मीद कर रहे हैं। System.Net.WebClient स्वचालित रूप से प्रारंभिक अनुरोध पर प्राधिकरण शीर्षलेख शामिल नहीं करता है। यह केवल उन्हें भेजता है जब प्रतिक्रिया द्वारा उचित रूप से चुनौती दी जाती है, जो कि मेरे ज्ञान के लिए एक 401 स्थिति कोड और एक उचित WWW- प्रमाणीकरण शीर्षलेख है। अधिक जानकारी के लिए here और here देखें।

मुझे लगता है कि आपका मूल प्रमाणीकरण हैंडलर डब्ल्यूडब्ल्यूडब्ल्यू-प्रमाणीकरण शीर्षलेख वापस नहीं कर रहा है और इस तरह के वेब क्लाइंट कभी भी दूसरे अनुरोध पर प्रमाण पत्र भेजने का प्रयास नहीं करता है। आपको इसे फिडलर या इसी तरह के टूल में देखने में सक्षम होना चाहिए।

अपने हैंडलर कुछ इस तरह किया था, तो आप WebClient दृष्टिकोण काम कर रहे गवाह चाहिए:

//if is not authenticated or Authorization header is null 
return base.SendAsync(request, cancellationToken).ContinueWith(task => 
    { 
     var response = task.Result; 
     response.StatusCode = HttpStatusCode.Unauthorized; 
     response.Headers.Add("WWW-Authenticate", "Basic realm=\"www.whatever.com\""); 
     return response; 
    }); 

//else (is authenticated) 
return base.SendAsync(request, cancellationToken); 

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

+0

बिल्कुल सही - यह काम किया! आपका बहुत बहुत धन्यवाद। – nickthompson

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