2012-10-31 16 views
11

MSDN के अनुसार, जब HttpWebRequest.AllowAutoRedirect संपत्ति सत्य है, तो रीडायरेक्ट प्रमाणीकरण शीर्षलेख साफ़ कर देंगे।HttpWebRequest.AllowAutoRedirect के साथ प्रमाणीकरण को कैसे संभालें?

प्राधिकरण हैडर ऑटो रीडायरेक्ट पर मंजूरी दे दी और HttpWebRequest अपने आप पुनर्निर्देशित स्थान पर पुन: प्रमाणीकृत करने की कोशिश करता है: वैकल्पिक हल दी IAuthenticationModule प्रमाणीकरण को संभालने के लिए लागू करने के लिए है। प्रैक्टिस में, इसका मतलब यह है कि अगर कोई रीडायरेक्शन का सामना करना संभव हो तो कोई एप्लिकेशन प्राधिकरण शीर्षलेख में कस्टम प्रमाणीकरण जानकारी नहीं डाल सकता है। इसके बजाए, एप्लिकेशन को एक कस्टम प्रमाणीकरण मॉड्यूल को लागू और पंजीकृत करना होगा। System.Net.AuthenticationManager और संबंधित क्लास का उपयोग कस्टम प्रमाणीकरण मॉड्यूल को लागू करने के लिए किया जाता है। प्रमाणीकरण प्रबंधक। पंजीयक विधि एक कस्टम प्रमाणीकरण मॉड्यूल पंजीकृत करता है। जब मैं एक अनुरोध है कि रीडायरेक्ट नहीं करता बनाने

public class Program 
{ 
    static void Main(string[] args) 
    { 
     // replaces the existing handler for Basic authentication 
     AuthenticationManager.Register(new CustomBasic()); 
     // make a request that requires authentication 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@"https://www.SomeUrlThatRequiresAuthentication.com"); 
     request.Method = "GET"; 
     request.KeepAlive = false; 
     request.ContentType = "text/plain"; 
     request.AllowAutoRedirect = true; 
     request.Credentials = new NetworkCredential("userName", "password"); 
     HttpWebResponse result = (HttpWebResponse)request.GetResponse(); 
    } 
} 

: कार्यक्षमता व्यायाम करने के लिए

public class CustomBasic : IAuthenticationModule 
{ 
    public CustomBasic() { } 

    public string AuthenticationType { get { return "Basic"; } } 

    public bool CanPreAuthenticate { get { return true; } } 

    private bool checkChallenge(string challenge, string domain) 
    { 
     if (challenge.IndexOf("Basic", StringComparison.InvariantCultureIgnoreCase) == -1) { return false; } 
     if (!string.IsNullOrEmpty(domain) && challenge.IndexOf(domain, StringComparison.InvariantCultureIgnoreCase) == -1) { return false; } 
     return true; 
    } 

    public Authorization PreAuthenticate(WebRequest request, ICredentials credentials) 
    { 
     return authenticate(request, credentials); 
    } 

    public Authorization Authenticate(String challenge, WebRequest request, ICredentials credentials) 
    { 
     if (!checkChallenge(challenge, string.Empty)) { return null; } 
     return this.authenticate(request, credentials); 
    } 

    private Authorization authenticate(WebRequest webRequest, ICredentials credentials) 
    { 
     NetworkCredential requestCredentials = credentials.GetCredential(webRequest.RequestUri, this.AuthenticationType); 
     return (new Authorization(string.Format("{0} {1}", this.AuthenticationType, Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", requestCredentials.UserName, requestCredentials.Password)))))); 
    } 
} 

और एक साधारण ड्राइवर:

मैं इस इंटरफेस की एक बुनियादी कार्यान्वयन बनाया मेरी कक्षा पर Authenticate विधि कहा जाता है, और प्रमाणीकरण सफल होता है। जब मैं एक अनुरोध करता हूं जो 307 (अस्थायी रीडायरेक्ट) प्रतिक्रिया को दोहराता है, तो मेरी कक्षा के किसी भी तरीके को नहीं कहा जाता है, और प्रमाणीकरण विफल रहता है। यहाँ क्या चल रहा है?

मैं ऑटो रीडायरेक्ट को अक्षम नहीं करता और 3xx प्रतिक्रियाओं को संभालने के लिए कस्टम तर्क लिखना नहीं चाहता हूं। ऑटो रीडायरेक्ट के साथ काम करने के लिए मैं अपना प्रमाणीकरण तर्क कैसे प्राप्त कर सकता हूं?

+0

आप इस कोशिश कर सकते हैं जब आप के बजाय सही गलत पर KeepAlive सेट:

निम्न संसाधन इस बात की पुष्टि करने (.NET प्रलेखन संदर्भ ओपी में उल्लेख किया है की तुलना में) लग रहा था? या अनुरोध लाइन में रीडायरेक्ट यूआरएल रखें? इस बारे में ज्यादा पता नहीं है, लेकिन शायद यह –

+0

FWIW में मदद करता है, मैं वास्तव में एक ही समस्या हो रहा है और एक समाधान की तलाश में। – tomo

उत्तर

-2

आपको क्या करना है POST अनुरोध की संभावना है। आप प्रमाणित करने के लिए चर पोस्ट कर रहे हैं, इस प्रकार आपको POST क्रिया का उपयोग करने की आवश्यकता है।

अधिक जानकारी के लिए यह पोस्ट देखें: Login to website, via C#

ऑटो रीडायरेक्ट इस पोस्ट अनुरोध के रास्ते में नहीं मिलना चाहिए। मैं फिडलर स्थापित करने और मैन्युअल रूप से लॉग इन करने की सलाह देना चाहता हूं, और फिर क्या होता है देख रहा हूं।

* ध्यान रखें, POST अनुरोध भेजते समय, यदि कोई लॉगिन फॉर्म है, तो आप फॉर्म में action='/some-url-or-whatever.php' टैग को POST अनुरोध भेज रहे हैं। POST उस पर डेटा, और आप बस ठीक से लॉग इन करने में सक्षम होना चाहिए।

अगर यह मदद करता है तो मुझे बताएं।

+0

यह उत्तर प्रश्न से संबंधित नहीं है। प्रश्न विशेष रूप से रीडायरेक्ट के दौरान प्रमाणीकरण शीर्षकों को मंजूरी मिलने के बारे में पूछता है। –

4

नेटवर्क प्रमाण पत्र के स्थान पर, आपको अनुरोध के लिए एक CredentialCache पास करना होगा। प्रमाण पत्र।

CredentialCache cache = new CredentialCache(); 
cache.Add(new Uri(@"https://www.SomeUrlThatRequiresAuthentication.com", "Basic", new NetworkCredential("username", "password")); 
request.Credentials = cache; 

MSDN प्रलेखीकरण के अनुसार:

CredentialCache कई इंटरनेट संसाधनों के लिए वर्ग भंडार साख। ऐसे अनुप्रयोग जिन्हें एकाधिक संसाधनों तक पहुंचने की आवश्यकता है उन संसाधनों के लिए प्रमाण-पत्र को CredentialCache उदाहरण में संग्रहित करता है जो तब आवश्यक होने पर इंटरनेट संसाधन को प्रमाण-पत्रों का उचित सेट प्रदान करता है।जब GetCredential विधि कहा जाता है, यह यूनिफ़ॉर्म रिसोर्स पहचानकर्ता (URI) और प्रमाणीकरण कैश और रिटर्न क्रेडेंशियल से मेल का पहला सेट में संग्रहीत उन के साथ प्रदान की प्रकार तुलना करती है।

0

मैं एक और विकल्प है कि मैं कोड परियोजना यूआरएल http://www.codeproject.com/Articles/49243/Handling-Cookies-with-Redirects-and-HttpWebRequest

String targetUrl = "https://www.SomeUrlThatRequiresAuthentication.com"; 

    HttpWebRequest request = GetNewRequest(targetUrl); 
    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

    while (response.StatusCode == HttpStatusCode.MovedPermanently) 
    { 
     response.Close(); 
     request = GetNewRequest(response.Headers["Location"]); 
     response = (HttpWebResponse)request.GetResponse(); 
    } 


private static HttpWebRequest GetNewRequest(string targetUrl) 
{ 

    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(targetUrl); 
    request.AllowAutoRedirect = false; 
    request.Headers.Add("Authorization", "Basic xxxxxxxx"); 
    return request; 
} 
0

हालांकि ओपी बहुत पुरानी है से ले लिया होगा निम्नलिखित उम्मीद है, मैं जवाब के रूप में गड्ढा की प्रतिक्रिया को मनोनीत करेंगे। मैं एक कस्टम प्रमाणीकरण मॉड्यूल भले ही वेब संसाधन मैं ऐक्सेस कर रहे थे केवल मूल प्रमाणीकरण के लिए इस्तेमाल किया बनाने सहित समान gyrations, के माध्यम से चला गया। क्या मैंने पाया है कि के बाद ही मैं एक साधारण NetworkCredential के बजाय एक CredentialCache इस्तेमाल किया,, मेरे प्रमाणीकरण मॉड्यूल रीडायरेक्ट के बाद कहा जाता है से मिला था।

इसके अलावा, मैंने पाया कि मुझे प्रमाणीकरण की आवश्यकता थी, केवल प्रमाण पत्र कैश की आपूर्ति करके मुझे कस्टम प्रमाणीकरण मॉड्यूल की आवश्यकता नहीं थी - मानक मूल मॉड्यूल ठीक काम करता था।

https://blogs.msdn.microsoft.com/ncl/2009/05/05/custom-http-authentication-schemes/

+0

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

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