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.