বেসিক প্রমাণীকরণ ব্যবহার করে এইচটিটিপিওয়েবরেউয়েস্ট


139

আমি এমন একটি প্রমাণীকরণের অনুরোধটি যাবার চেষ্টা করছি যা এই আচরণের জন্য আইআইএস সেট আপ করার সময় আমরা দেখতে ব্যবহৃত "বুনিয়াদি লেখকের অনুরোধ" নকল করি।

URL টি হ'ল: https://telematicoprova.agenziadogane.it/TelematoServiziDiUtilitaWeb/SeriziDiUtilitaAutServlet?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();

(আমি এই সাইটের অন্য পোস্ট থেকে এটি অনুলিপি করেছি)। তবে আমি সার্ভারের কাছ থেকে এই উত্তরটি পেয়েছি:

অন্তর্নিহিত সংযোগটি বন্ধ ছিল: একটি প্রেরণে একটি অপ্রত্যাশিত ত্রুটি ঘটেছে।

আমি মনে করি যে আমি সি # তে আমার জ্ঞানটি আমাকে দেওয়ার জন্য প্রতিটি সম্ভাব্য কাজটি চেষ্টা করেছি, তবে কিছুই নেই ...


আমার মনে হয় আপনি যদি যুক্ত করে থাকেন তবে এইটি কাজ করবে: অনুরোধ।
বিপিাইকস

উত্তর:


275

আপনি নিজেই অনুমোদনের শিরোনাম যুক্ত করতে পারেন।

কেবলমাত্র "অনুমোদন" নাম এবং মানটি "বেসিক BASE64 ({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);

সম্পাদন করা

ইউটিএফ -8 থেকে আইএসও 8859-1 এ এনকোডিং স্যুইচ করেছেন HTTP বেসিক প্রমাণীকরণের জন্য আমার কোন এনকোডিংটি ব্যবহার করা উচিত? এবং জেরোইনের মন্তব্য।


3
সুতরাং আপনি কীভাবে নিশ্চিত যে ইউটিএফ 8 সঠিকভাবে ব্যবহারের জন্য এনকোডিং রয়েছে?
জেরোয়েন ওয়েয়ার্ট প্লুয়িমার

2
সুন্দর ক্যাচ. দেখে মনে হচ্ছে অনুরোধের প্রমাণীকরণের শিরোনামটি আইএসও -8859-1-এ এনকোড করা উচিত। প্রতি stackoverflow.com/questions/7242316/...
Zambonilli

1
Aaaargh! 1: ধন্যবাদ, সাথী। ২. আমি সত্যিই বুঝতে চাইছি যে ক্রেডেনসিয়াল ক্যাশে প্রমাণীকরণ পদ্ধতিটি সেট করে অন্য পদ্ধতিগুলি মোটেই কার্যকর হয় না। তাদের ধারণা করা হয়, তাই না?
mshthn

1
সমস্ত এমএসডিএন ডকুমেন্টেশন হ্যাঁ নির্দেশ করে, অন্যান্য পদ্ধতিতে কাজ করা উচিত। তবে আমি তাদের কখনই কাজে লাগাতে পারিনি।
জাম্বোনিলি

আমার পক্ষে কাজ করছে না (utf-8 বা আইএসও -8859-1 না)। কোন পরামর্শ কি চেক? আমি যখন "ওয়েবআরকিউস্ট। ক্রেডিটেন্টালস = নতুন নেটওয়ার্ককারেনডিয়েন্টাল (ইউজারআইডি, পাসওয়ার্ড) করি তখন এটি কার্যকর হয়;" ।
রোলারকোস্টা

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; 

এটা কি নিশ্চিতভাবেই মৌলিক লেখিকা? এছাড়াও, আপনি কোনও ব্রাউজারের মাধ্যমে আপনার ব্যবহারকারীর নাম / পাসওয়ার্ড দিয়ে সংস্থানটি অ্যাক্সেস করতে পারবেন?
মিঃ আইয়েস

এটি https- র মাধ্যমে একটি প্রাথমিক লেখক বলে মনে হচ্ছে। যদি আপনি প্রদত্ত লিঙ্কটিতে ক্লিক করেন, ব্রাউজারটি আইআইএসে "বেসিক লেখক" করার সময় বা অ্যাপাচের মাধ্যমে একটি ফোল্ডারে একটি .htaccss ফাইল ব্যবহার করার সময় ব্যবহারকারী হিসাবে / পাসওয়ার্ডটির অনুরোধটিকে অনুরূপভাবে পপ আপ করে দেয় I আমার কোনও ধারণা নেই
কেনি রুলো

আমি কেবল শিখেছি যে ওয়েবসাইটটি আইবিএম HTTP সার্ভারের অধীনে চলছে। এটি একটি সহায়ক সংবাদ হতে পারে?
কেনি রুলো

5

যাঁরা রেস্টশার্প ব্যবহার করছেন তাদের ক্ষেত্রে , সিম্পলঅথেক্সেটর ব্যবহার করার সময় এটি ব্যর্থ হতে পারে (সম্ভবত দৃশ্যের পিছনে আইএসও -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

বুনিয়াদি প্রমাণীকরণ এবং প্রক্সি বাস্তবায়িত হলে নিম্নলিখিত কোডটি জসন প্রতিক্রিয়ার সমাধান করবে I এছাড়াও আইআইএস 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 বা আইএসও -8859-1 বা ডিফল্ট নয়)। কোন পরামর্শ যাচাই করতে হবে? দয়া করে নোট করুন - আমি যখন "ওয়েবআরকিউস্ট। ক্রেডিটেন্টালস = নতুন নেটওয়ার্কক্রেনডিয়েনশিয়াল (ইউজারআইডি, পাসওয়ার্ড) করি তখন এটি কার্যকর হয়;"
রোলারকোস্টা

2

অনুমানটি "আইএসও -8859-1" বা "অপরিজ্ঞাত" হিসাবে পড়া যায়। তোমার পছন্দ. এটি জানা যায় যে অনেক সার্ভারগুলি আইএসও -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

প্রথম কথা, আমার জন্য সার্ভিসপয়েন্ট ম্যানেজ.সিকিউরিটিপ্রোটোকল = সিকিউরিটিপ্রোটোকল টাইপ। Ts12 এসএসএল 3 এর পরিবর্তে কাজ করেছে।

দ্বিতীয়ত, আমাকে কিছু ডেটা (ফর্ম-urlencoded) সহ বেসিক আথ অনুরোধটি প্রেরণ করতে হয়েছিল। এখানে অনেকগুলি সমাধানের চেষ্টা করার পরে সম্পূর্ণ নমুনাটি আমার পক্ষে নিখুঁতভাবে কাজ করেছিল।

দাবি অস্বীকার: নীচের কোডটি এই লিঙ্কটিতে পাওয়া কয়েকটি সমাধানের মিশ্রণ এবং কিছু অন্যান্য স্ট্যাকওভারফ্লো লিঙ্ক রয়েছে, দরকারী তথ্যের জন্য ধন্যবাদ।

        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();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.