बेसिक प्रमाणीकरण का उपयोग करके HttpWebRequest


139

मैं एक प्रमाणीकरण अनुरोध के माध्यम से जाने की कोशिश कर रहा हूं, जो इस व्यवहार के लिए IIS स्थापित करते समय हम "बुनियादी सामान्य अनुरोध" की नकल करते हैं।

URL है: https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC/22&SC=1&ST=2
(चेतावनी: https)!

यह सर्वर अनुप्रयोग सर्वर के रूप में यूनिक्स और जावा के तहत चल रहा है।

यह वह कोड है जो मैं इस सर्वर से कनेक्ट करने के लिए उपयोग करता हूं:

CookieContainer myContainer = new CookieContainer();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2");
request.Credentials = new NetworkCredential(xxx,xxx);
request.CookieContainer = myContainer;
request.PreAuthenticate = true;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

(मैंने इसे इस साइट पर एक और पोस्ट से कॉपी किया)। लेकिन मुझे सर्वर से यह जवाब मिला:

अंतर्निहित कनेक्शन बंद कर दिया गया था: एक अनपेक्षित त्रुटि एक भेजने पर हुई।

मुझे लगता है कि मैंने C # पर अपने ज्ञान के लिए हर संभव कोशिश की, मुझे प्रस्ताव देना है, लेकिन कुछ भी नहीं ...


मुझे लगता है कि अगर आपने जोड़ दिया होता तो यह काम कर लेता: request.UseDefaultCredentials = false;
16

जवाबों:


275

आप स्वयं प्राधिकरण शीर्ष लेख भी जोड़ सकते हैं।

बस नाम "प्राधिकरण" और मूल्य "मूल आधार 64 ({USERNAME: PASSWORD})" बनाएं

String username = "abc";
String password = "123";
String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(username + ":" + password));
httpWebRequest.Headers.Add("Authorization", "Basic " + encoded);

संपादित करें

UTF-8 से ISO 8859-1 तक एन्कोडिंग को स्विच किया जाए। मुझे HTTP बेसिक ऑथेंटिकेशन के लिए किस एन्कोडिंग का उपयोग करना चाहिए? और जरीन की टिप्पणी।


3
तो आपको कैसे पता चलेगा कि UTF8 उपयोग करने के लिए सही एन्कोडिंग है?
जीरन वीरट प्लिमर्स

2
अच्छा पकड़ा। ऐसा लगता है कि अनुरोध प्रमाणीकरण हैडर को ISO-8859-1 में इनकोड किया जाना चाहिए। प्रति stackoverflow.com/questions/7242316/…
ज़ांबोनिली

1
Aaaargh! 1: धन्यवाद, दोस्त। 2. मैं वास्तव में यह समझना चाहूंगा कि क्यों अन्य तरीके, क्रेडेंशियल कैश में प्रमाणीकरण विधि की स्थापना, बिल्कुल भी काम नहीं करेंगे। वे माना जाता है, वे नहीं हैं?
मशन

1
सभी msdn प्रलेखन हाँ की ओर इशारा करते हैं, अन्य तरीकों से काम करना चाहिए। हालाँकि, मैं उन्हें काम पर लाने में कभी सक्षम नहीं रहा।
ज़ाम्बोनिली

मेरे लिए काम नहीं कर रहा है (न ही utf-8 और न ही ISO-8859-1)। किसी भी सुझाव की जाँच करने के लिए क्या? यह काम करता है जब मैं "webRequest.Credentials = new NetworkCredential (UserID, पासवर्ड)" करता हूं; ।
रोलरकोस्टा

56

मैं आखिरकार मिल गया!

string url = @"https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2";
WebRequest request = WebRequest.Create(url);
request.Credentials = GetCredential();
request.PreAuthenticate = true;

और यह है GetCredential()

private CredentialCache GetCredential()
{
    string url = @"https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2";
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
    CredentialCache credentialCache = new CredentialCache();
    credentialCache.Add(new System.Uri(url), "Basic", new NetworkCredential(ConfigurationManager.AppSettings["ead_username"], ConfigurationManager.AppSettings["ead_password"]));
    return credentialCache;
}

वाह!


29

यदि आप WebClientकक्षा का उपयोग कर सकते हैं , तो मूल प्रमाणीकरण का उपयोग करना सरल हो जाता है:

var client = new WebClient {Credentials = new NetworkCredential("user_name", "password")};
var response = client.DownloadString("https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2");

8

इसे इस्तेमाल करे:

System.Net.CredentialCache credentialCache = new System.Net.CredentialCache(); 
credentialCache.Add(
    new System.Uri("http://www.yoururl.com/"),
    "Basic", 
    new System.Net.NetworkCredential("username", "password")
);

...
...

httpWebRequest.Credentials = credentialCache; 

क्या यह निश्चित रूप से मूलभूत है? इसके अलावा, क्या आप एक ब्राउज़र के माध्यम से अपने उपयोगकर्ता नाम / पासवर्ड के साथ संसाधन का उपयोग कर सकते हैं?
MrEyes

ऐसा लगता है कि यह https पर एक बुनियादी नीति है। यदि आप मेरे द्वारा दिए गए लिंक पर क्लिक करते हैं, तो ब्राउज़र उपयोगकर्ता नाम / पासवर्ड को पॉप अप करता है, जैसा कि जब आप IIS पर "बुनियादी स्थिति" करते हैं या Apache के माध्यम से फ़ोल्डर पर .htaccss फ़ाइल का उपयोग करते हैं। मैंने फ़िडलर का उपयोग करने की कोशिश की। मुझे कोई सुराग नहीं है।
केनी रुल्लो

मैंने अभी सीखा कि वेबसाइट आईबीएम http सर्वर के तहत चल रही है। यह एक सहायक समाचार हो सकता है?
केनी रुल्लो

5

का उपयोग करते हुए उन लोगों के लिए RestSharp , यह का उपयोग करते समय विफल हो सकता है SimpleAuthenticator (संभवतः कारण ISO-8859-1 दृश्य के पीछे का उपयोग नहीं करने के लिए)। मैं मूल प्रमाणीकरण शीर्षकों को स्पष्ट रूप से भेजकर इसे प्राप्त करने में कामयाब रहा:

string username = "...";
string password = "...";

public IRestResponse GetResponse(string url, Method method = Method.GET)
{
    string encoded = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes($"{username}:{password}"));
    var client = new RestClient(url);
    var request = new RestRequest(method );
    request.AddHeader("Authorization", $"Basic {encoded}");
    IRestResponse response = client.Execute(request);
    return response;
}

var response = GetResponse(url);
txtResult.Text = response.Content;

3

यदि बेसिक ऑथेंटिकेशन और प्रॉक्सी लागू हो जाए तो निम्नलिखित कोड json की प्रतिक्रिया को हल कर देगा। IIS 7.5 होस्टिंग प्रोब्लम हल करेगा।

public string HttpGetByWebRequ(string uri, string username, string password)
{
//For Basic Authentication
    string authInfo = username + ":" + password;
    authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));

//For Proxy
    WebProxy proxy = new WebProxy("http://10.127.0.1:8080", true);

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
    request.Method = "GET";
    request.Accept = "application/json; charset=utf-8";
    request.Proxy = proxy;

    request.Headers["Authorization"] = "Basic " + authInfo;

    var response = (HttpWebResponse)request.GetResponse();

    string strResponse = "";
    using (var sr = new StreamReader(response.GetResponseStream()))
    {
        strResponse= sr.ReadToEnd();

    }

    return strResponse;
}

मेरे लिए काम नहीं कर रहा है (न तो utf-8 और न ही ISO-8859-1 और न ही डिफ़ॉल्ट)। किसी भी सुझाव के लिए क्या जाँच करें? कृपया ध्यान दें - यह तब काम करता है जब मैं "webRequest.Credentials = new NetworkCredential (UserID, पासवर्ड);"
रोलरकोस्टा

2

कल्पना को "ISO-8859-1" या "अपरिभाषित" के रूप में पढ़ा जा सकता है। आपकी पंसद। यह ज्ञात है कि कई सर्वर ISO-8859-1 का उपयोग करते हैं (जैसे कि यह या नहीं) और जब आप कुछ और भेजेंगे तो विफल हो जाएगा।

अधिक जानकारी और स्थिति को ठीक करने के प्रस्ताव के लिए, http://greenbytes.de/tech/webdav/draft-reschke-basicauth-enc-latest.html देखें


1

निम्नलिखित निर्माण मेरे लिए सही ढंग से काम नहीं कर रहा था:

request.Credentials = new NetworkCredential("user", "pass");

मैंने CredentialCacheइसके बजाय उपयोग किया है:

CredentialCache credentialCache = new CredentialCache
{
    {
        new Uri($"http://{request.Host}/"), "Basic",
        new NetworkCredential("user", "pass")
    }
};
request.Credentials = credentialCache;

हालाँकि, यदि आप कई मूल अधिकार क्रेडेंशियल जोड़ना चाहते हैं (उदाहरण के लिए यदि पुनर्निर्देशन है कि आप जानते हैं) तो आप निम्नलिखित फ़ंक्शन का उपयोग कर सकते हैं जो मैंने बनाया है:

private void SetNetworkCredential(Uri uriPrefix, string authType, NetworkCredential credential)
{
    if (request.Credentials == null)
    {
        request.Credentials = new CredentialCache();
    }

    if (request.Credentials.GetCredential(uriPrefix, authType) == null)
    {
        (request.Credentials as CredentialCache).Add(uriPrefix, authType, credential);
    }
}

मुझे उम्मीद है कि यह भविष्य में किसी की मदद करेगा।


0

पहली बात, मेरे लिए ServicePointManager.SecurityProtocol = SecurityProtocolType। Ts12 ने Ssl3 के बजाय काम किया।

दूसरे, मुझे कुछ डेटा (फॉर्म-यूरेलनकोड) के साथ बेसिक ऑथेंट रिक्वेस्ट भेजनी थी। यहाँ कई नमूनों की कोशिश करने के बाद पूरा नमूना है जो मेरे लिए पूरी तरह से काम करता है।

डिस्क्लेमर: नीचे दिया गया कोड इस लिंक पर पाए गए समाधानों का मिश्रण है और कुछ अन्य स्टैकओवरफ्लो लिंक, उपयोगी जानकारी के लिए धन्यवाद।

        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
        String username = "user_name";
        String password = "password";
        String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(username + ":" + password));

        //Form Data
        var formData = "var1=val1&var2=val2";
        var encodedFormData = Encoding.ASCII.GetBytes(formData);

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("THE_URL");
        request.ContentType = "application/x-www-form-urlencoded";
        request.Method = "POST";
        request.ContentLength = encodedFormData.Length;
        request.Headers.Add("Authorization", "Basic " + encoded);
        request.PreAuthenticate = true;

        using (var stream = request.GetRequestStream())
        {
            stream.Write(encodedFormData, 0, encodedFormData.Length);
        }

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.