HttpWebRequest menggunakan otentikasi Dasar


138

Saya mencoba memeriksa permintaan otentikasi yang meniru "permintaan otentikasi dasar" yang biasa kita lihat ketika mengatur IIS untuk perilaku ini.

URL-nya adalah: https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2
(peringatan: https!)

Server ini berjalan di bawah UNIX dan Java sebagai server aplikasi.

Ini adalah kode yang saya gunakan untuk terhubung ke server ini:

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();

(Saya menyalin ini dari pos lain di situs ini). Tetapi saya menerima jawaban ini dari server:

Koneksi yang mendasarinya ditutup: Kesalahan tak terduga terjadi pada pengiriman.

Saya rasa saya mencoba setiap tugas yang mungkin yang saya ketahui tentang C # yang ditawarkan, tetapi tidak ada ...


Saya pikir ini akan bekerja jika Anda telah menambahkan: request.UseDefaultCredentials = false;
— bpeikes

Jawaban:


274

Anda juga bisa menambahkan tajuk otorisasi sendiri.

Cukup buat nama "Otorisasi" dan nilai "Basic 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);

Edit

Beralih encoding dari UTF-8 ke ISO 8859-1 per Encoding apa yang harus saya gunakan untuk Otentikasi HTTP Dasar? dan komentar Jeroen.


3
Jadi, bagaimana Anda tahu pasti bahwa UTF8 adalah pengkodean yang tepat untuk digunakan?
— Jeroen Wiert Pluimers

2
Tangkapan bagus. Sepertinya header Otentikasi permintaan harus dikodekan dalam ISO-8859-1. Per stackoverflow.com/questions/7242316/...
— Zambonilli

1
Aaaargh! 1: Terima kasih, sobat. 2. Saya benar-benar ingin memahami mengapa metode lain, mengatur metode otentikasi di CredentialCache, tidak akan berfungsi sama sekali. Mereka seharusnya, bukan?
— mshthn

1
Semua dokumentasi msdn menunjuk ke ya, metode lain harus berfungsi. Namun, saya tidak pernah bisa membuatnya bekerja.
— Zambonilli

Tidak bekerja untuk saya (utf-8 atau ISO-8859-1). Ada saran apa yang harus diperiksa? Ini berfungsi ketika saya melakukan "webRequest.Credentials = new NetworkCredential (UserID, Password);" .
— RollerCosta

56

Saya akhirnya mendapatkannya!

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;

dan ini adalah 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;
}

YAY!


29

Jika Anda dapat menggunakan WebClientkelas, menggunakan otentikasi dasar menjadi sederhana:

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

Coba ini:

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; 

Apakah ini auth dasar? Juga, dapatkah Anda mengakses sumber daya dengan nama pengguna / kata sandi Anda melalui browser?
— MrEyes

Tampaknya menjadi otentikasi dasar di https. Jika Anda mengklik tautan yang saya berikan, browser akan menampilkan nama pengguna / kata sandi "permintaan seperti yang Anda lakukan" auth dasar "pada IIS atau menggunakan file .htaccss pada folder melalui apache. Saya mencoba menggunakan fiddler tetapi saya tidak tahu
— Kenny Rullo

Saya baru tahu bahwa situs web berjalan di bawah server IBM http. Ini bisa menjadi berita yang bermanfaat?
— Kenny Rullo

5

Bagi mereka yang menggunakan RestSharp , mungkin gagal ketika menggunakan SimpleAuthenticator (mungkin karena tidak menggunakan ISO-8859-1 di belakang layar). Saya berhasil menyelesaikannya dengan mengirim secara eksplisit tajuk Otentikasi Dasar:

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

Kode berikut akan menyelesaikan respons json jika ada Otentikasi Dasar dan Proxy diimplementasikan. Juga IIS 7.5 Hostingmasalah akan menyelesaikan.

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;
}

Tidak bekerja untuk saya (baik utf-8 atau ISO-8859-1 atau standar). Ada saran yang harus diperiksa? Harap diperhatikan - Ini berfungsi saat saya melakukan "webRequest.Credentials = new NetworkCredential (UserID, Password);"
— RollerCosta


1

Konstruksi berikut ini tidak berfungsi dengan benar untuk saya:

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

Saya telah menggunakan CredentialCachesebagai gantinya:

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

Namun, jika Anda ingin menambahkan beberapa kredensial auth dasar (misalnya jika ada pengalihan yang Anda ketahui), Anda dapat menggunakan fungsi berikut yang telah saya buat:

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);
    }
}

Saya harap ini akan membantu seseorang di masa depan.


0

Hal pertama, bagi saya ServicePointManager.SecurityProtocol = SecurityProtocolType. Tls12 bekerja bukan Ssl3.

Kedua, saya harus mengirim permintaan Auth Basic bersama dengan beberapa data (form-urlencoded). Ini adalah contoh lengkap yang bekerja untuk saya dengan sempurna, setelah mencoba banyak solusi.

Penafian: Kode di bawah ini adalah campuran dari solusi yang ditemukan pada tautan ini dan beberapa tautan stackoverflow lainnya, terima kasih atas informasi yang bermanfaat.

        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();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.