2011-11-09 10 views
8

काम नहीं करता है निम्न कोड चल रहा है:नेट HttpWebRequest यूआरआई के माध्यम से करने के लिए उपयोगकर्ता नाम और पासवर्ड पासिंग

var request = HttpWebRequest.Create("http://username:[email protected]/test-http-status-codes.asp?code=401"); 
var response = request.GetResponse(); 

... और Wireshark का उपयोग कर अनुरोध निरीक्षण पता चलता है कि कोई प्राधिकरण मेरे मुवक्किल द्वारा प्रयास किया गया (यूआरएल है एक साधारण सेवा जो हमेशा 401 लौटाएगी)।

इस कोड को प्रारंभिक चुनौती के बाद एक प्राधिकरण हैडर भेजता है:

var request = HttpWebRequest.Create("http://username:[email protected]anttools.com/test-http-status-codes.asp?code=401"); 
request.Credentials = new NetworkCredential("username", "password"); 
var response = request.GetResponse(); 

का उपयोग System.Uri वर्ग कोई प्रभाव नहीं है। यूआरएल में यूजरनेम और पासवर्ड का प्रमाणीकरण क्यों नहीं किया जाता है?

(मैं एक प्रारंभिक चुनौती के बिना प्राधिकरण हैडर गुजर पर this blog post के बारे में पता कर रहा हूँ, लेकिन वह हाथ में मुद्दा नहीं है)

संपादित मैं जोड़ने चाहिए कि यह इस सीमा के आसपास काम करने के लिए काफी आसान है

var userInfo = request.Address.UserInfo; 
if (!string.IsNullOrEmpty(userInfo) && userInfo.Contains(':')) 
{ 
    request.Credentials = new NetworkCredential(userInfo.Split(':').First(), userInfo.Split(':').Last()); 
} 

उत्तर

3

HttpWebRequest वर्ग Uri में साख का उपयोग नहीं करता है:, कोड के इस बिट के साथ (उदाहरण के लिए जोड़ने यूआरएल स्वाद के लिए संयुक्त राष्ट्र-भागने), मैं करने के लिए कारण है कि आप ऐसा करने के लिए है के रूप में बस उत्सुक हूँ (प्रति डॉटपीक)।

लेकिन FtpWebRequest करता है, यहाँ प्रासंगिक कोड है:

if (this.m_Uri.UserInfo != null && this.m_Uri.UserInfo.Length != 0) 
    { 
    string userInfo = this.m_Uri.UserInfo; 
    string userName = userInfo; 
    string password = ""; 
    int length = userInfo.IndexOf(':'); 
    if (length != -1) 
    { 
     userName = Uri.UnescapeDataString(userInfo.Substring(0, length)); 
     int startIndex = length + 1; 
     password = Uri.UnescapeDataString(userInfo.Substring(startIndex, userInfo.Length - startIndex)); 
    } 
    networkCredential = new NetworkCredential(userName, password); 
    } 

आप देख सकते हैं कि यह सिर्फ साख को यह देता है, तो आप सिर्फ क्या करना चाहिए कि बजाय एक पार्स Uri

+0

हाँ साथ मैन्युअल रूप से, मेरे पास कोड का एक समान कोड है - मुझे नहीं लगता कि क्यों HttpWebRequest इसे अनदेखा करता है ... – friism

+1

मुझे लगता है कि यह एक सुरक्षा समस्या है। कई ब्राउज़र अब भी इसे अनदेखा करते हैं: http://support.microsoft.com/kb/834489 मुझे पिछले .NET संस्करणों को देखने के लिए वापस जाना होगा कि यह कभी भी इसका उपयोग करने के लिए कोड किया गया था, लेकिन इसकी स्पष्ट रूप से नहीं 4.0 में –

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