HttpWebRequest utilisant l'authentification de base

j'essaie de passer en revue une requête d'authentification qui imite la" requête d'authentification de base " que nous sommes habitués à voir lors de la configuration de IIS pour ce comportement.

L'URL est: https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2

(avertissement: https!)

ce serveur tourne sous UNIX et Java en tant que serveur d'application.

C'est le code que j'utilise pour me connecter à ce serveur:

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

(j'ai copié ceci d'un autre post sur ce site). Mais je reçois cette réponse du serveur:

la connexion sous-jacente a été fermée: une erreur inattendue est survenue le un envoyer.

je pense que j'ai essayé toutes les tâches possibles mes connaissances sur C# A à m'offrir, mais rien...

93
demandé sur CharithJ 2010-12-02 14:36:26

7 réponses

vous pouvez aussi simplement ajouter l'en-tête d'autorisation vous-même.

il suffit de faire le nom "Authorization" et la valeur " 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);

Modifier

a commuté L'encodage de UTF-8 à ISO 8859-1 par quel encodage dois-je utiliser pour L'authentification HTTP Basic? et le commentaire de Jeroen.

180
répondu Zambonilli 2017-05-23 11:47:31

j'ai enfin compris!

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;

et ça c'est 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!

46
répondu Kenny Rullo 2012-02-17 10:50:55

si vous pouvez utiliser la classe WebClient , l'authentification basique devient simple:

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");
21
répondu Tamir 2015-11-05 09:50:11

essayez ceci:

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; 
6
répondu MrEyes 2010-12-02 12:15:00

la spécification peut être lue comme" ISO-8859-1 "ou"non défini". De votre choix. Il est connu que de nombreux serveurs utilisent ISO-8859-1 (que cela vous plaise ou non) et échoueront quand vous enverrez quelque chose d'autre.

pour plus d'information et une proposition pour corriger la situation, voir http://greenbytes.de/tech/webdav/draft-reschke-basicauth-enc-latest.html

1
répondu Slan 2016-06-08 09:17:19

le code suivant résoudra la réponse json s'il y a une authentification de base et un Proxy implémenté.Aussi IIS 7.5 problème D'hébergement résoudra.

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
répondu Mahabubuzzaman 2018-04-19 07:55:30

pour ceux qui utilisent RestSharp , il pourrait échouer en utilisant SimpleAuthenticator (peut-être en raison de ne pas utiliser ISO-8859-1 derrière la scène). J'ai réussi à le faire en envoyant explicitement des en-têtes D'authentification de base:

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
répondu Alexei 2018-08-02 11:02:28