it-swarm.com.de

HttpWebRequest mit Standardauthentifizierung

Ich versuche, eine Authentifizierungsanforderung zu durchlaufen, die die "grundlegende Authentifizierungsanforderung" nachahmt, die wir normalerweise beim Einrichten von IIS für dieses Verhalten sehen.

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

Dieser Server läuft unter UNIX und Java als Anwendungsserver.

Dies ist der Code, den ich für die Verbindung zu diesem Server verwende:

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

(Ich habe dies von einem anderen Beitrag auf dieser Website kopiert). Ich erhalte jedoch diese Antwort vom Server:

Die zugrunde liegende Verbindung wurde geschlossen: Bei .__ ist ein unerwarteter Fehler aufgetreten. ein send.

Ich glaube, ich habe jede mögliche Aufgabe ausprobiert, die mir mein Wissen über C # bietet, aber nichts ...

105
Kenny Rullo

Sie können den Berechtigungskopf auch einfach selbst hinzufügen.

Geben Sie einfach den Namen "Authorization" und den Wert "Basic BASE64 ({USERNAME: PASSWORD})" ein.

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

Bearbeiten

Umstellung der Verschlüsselung von UTF-8 auf ISO 8859-1 per Welche Verschlüsselung sollte ich für die HTTP-Basisauthentifizierung verwenden? und Jeroens Kommentar.

210
Zambonilli

Ich habe es endlich geschafft!

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;

und das ist 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!

48
Kenny Rullo

Wenn Sie die WebClient-Klasse verwenden können, wird die Verwendung der Basisauthentifizierung einfach:

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");
25
Tamir

Versuche dies:

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; 
8
MrEyes

Der folgende Code löst die Antwort von Json, wenn Basic Authentication und Proxy implementiert sind. Auch IIS 7.5 Hosting Problm wird aufgelöst.

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

Wenn Sie RestSharp verwenden, schlägt dies möglicherweise fehl, wenn Sie SimpleAuthenticator verwenden (möglicherweise aufgrund der fehlenden Verwendung von ISO-8859-1 hinter den Kulissen). Ich habe es geschafft, indem ich explizit die Header der Standardauthentifizierung verschickte:

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;
1
Alexei

Die Spezifikation kann als "ISO-8859-1" oder "undefined" gelesen werden. Deine Entscheidung. Es ist bekannt, dass viele Server ISO-8859-1 verwenden (ob es nun so ist oder nicht) und es versagt, wenn Sie etwas anderes senden.

Weitere Informationen und einen Vorschlag zur Behebung der Situation finden Sie unter http://greenbytes.de/tech/webdav/draft-reschke-basicauth-enc-latest.html

1
Slan

Die folgende Konstruktion hat für mich nicht richtig funktioniert:

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

Ich habe stattdessen CredentialCache verwendet:

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

Wenn Sie jedoch mehrere grundlegende Berechtigungsnachweise für die Authentifizierung hinzufügen möchten (wenn Sie beispielsweise eine Umleitung kennen), können Sie die folgende Funktion verwenden, die ich vorgenommen habe:

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

Ich hoffe, dass es in Zukunft jemandem helfen wird.

0
Gucu112