Temel kimlik doğrulamasını kullanarak HttpWebRequest


139

Bu davranış için IIS kurarken görmeye alışkın olduğumuz "temel kimlik doğrulama isteğini" taklit eden bir kimlik doğrulama isteğinden geçmeye çalışıyorum.

URL: https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2
(uyarı: https!)

Bu sunucu uygulama sunucusu olarak UNIX ve Java altında çalışıyor.

Bu sunucuya bağlanmak için kullandığım kod:

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

(Bunu bu sitedeki başka bir gönderiden kopyaladım). Ancak bu yanıtı sunucudan alıyorum:

Temel bağlantı kapatıldı: Gönderimde beklenmeyen bir hata oluştu.

Sanırım C # hakkındaki bilgimin sunduğu her türlü görevi denedim, ama hiçbir şey ...


Ben eklerseniz bu bir işe yaradığını düşünüyorum: request.UseDefaultCredentials = false;
bpeikes

Yanıtlar:


278

Ayrıca yetkilendirme başlığını da kendiniz ekleyebilirsiniz.

"Yetkilendirme" adını ve "Temel BASE64 ({USERNAME: PASSWORD})" değerini yapmanız yeterlidir

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

Düzenle

Başına ISO 8859-1 için UTF-8 den kodlama Anahtarlı Ne kodlama ben HTTP Temel Kimlik Doğrulaması için kullanmak gerekir? ve Jeroen'in yorumu.


3
Peki UTF8'in kullanmak için doğru kodlama olduğundan nasıl emin olabilirsiniz?
Jeroen Wiert Pluimers

2
İyi yakaladın. Kimlik doğrulama üstbilgisinin ISO-8859-1'de kodlanmış olması gerektiği anlaşılıyor. Başına stackoverflow.com/questions/7242316/...
Zambonilli

1
Aaaargh! 1: Teşekkürler dostum. 2. CredentialCache'de kimlik doğrulama yöntemini ayarlayan diğer yöntemlerin neden işe yaramadığını gerçekten anlamak istiyorum. Yapmaları gerekiyordu, değil mi?
mshthn

1
Tüm msdn belgeleri evet, diğer yöntemler çalışmalıdır. Ancak, onları hiç çalıştıramadım.
Zambonilli

Benim için çalışmıyor (ne utf-8 ne de ISO-8859-1). Ne kontrol etmek için herhangi bir öneriniz var mı? "WebRequest.Credentials = new NetworkCredential (UserID, Password);" .
RollerCosta

56

Sonunda anladım!

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;

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

YAŞASIN!


29

WebClientSınıfı kullanabiliyorsanız, temel kimlik doğrulamasını kullanmak basitleşir:

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

Bunu dene:

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; 

Kesinlikle temel yetki mi? Ayrıca, kaynağa bir tarayıcı aracılığıyla kullanıcı adınız / şifrenizle erişebilir misiniz?
MrEyes

Https üzerinden temel bir kimlik doğrulama gibi görünüyor. Sağladığım bağlantıyı tıklatırsanız, IIS'de "temel kimlik doğrulaması" yaptığınızda veya apache yoluyla bir klasörde bir .htaccss dosyası kullandığınızda, tarayıcı aynı kullanıcı adı / parola "isteğini açar. hakkında hiçbir fikrim yok.
Kenny Rullo

Ben sadece web sitesi IBM http sunucusu altında çalıştığını öğrendim. Bu yararlı bir haber olabilir mi?
Kenny Rullo

5

Kullananlar için RestSharp kullanırken, bu başarısız olabilir SimpleAuthenticator (muhtemelen ISO-8859-1 sahnenin arkasında kullanmayan kadar). Temel Kimlik Doğrulama üstbilgilerini açıkça göndererek bunu başardım:

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

Aşağıdaki kod, Temel Kimlik Doğrulama ve Proxy uygulanmışsa json yanıtını çözecektir.Ayrıca IIS 7.5 Hosting Problm çözülecektir.

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

Benim için çalışmıyor (ne utf-8 ne de ISO-8859-1 veya varsayılan). Ne kontrol etmek için herhangi bir öneri? Lütfen dikkat - Ben "webRequest.Credentials = new NetworkCredential (UserID, Password);"
RollerCosta


1

Aşağıdaki yapı benim için düzgün çalışmıyor:

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

Bunun CredentialCacheyerine kullandım :

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

Ancak, birden fazla temel kimlik doğrulama bilgisi eklemek isterseniz (örneğin, farkında olduğunuz yeniden yönlendirme varsa), yaptığım aşağıdaki işlevi kullanabilirsiniz:

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

Umarım gelecekte birine yardım eder.


0

İlk şey, benim için ServicePointManager.SecurityProtocol = SecurityProtocolType. Tls12 , Ssl3 yerine çalıştı.

İkinci olarak, bazı verilerle birlikte (form-urlencoded) Temel Kimlik Doğrulama isteği göndermek zorunda kaldım. İşte birçok çözüm denedikten sonra benim için mükemmel çalışan tam örnek.

Feragatname: Aşağıdaki kod, bu bilgilerde ve diğer bazı yığın akışı bağlantılarında bulunan çözümlerin bir karışımıdır, faydalı bilgiler için teşekkürler.

        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();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.