web-dev-qa-db-fra.com

HttpWebRequest utilisant l'authentification de base

J'essaie de passer par une demande d'authentification qui imite la "demande d'authentification de base" à laquelle nous sommes habitués lors de la configuration de IIS pour ce comportement.

L’URL est la suivante: https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2
(avertissement: https!)

Ce serveur fonctionne sous UNIX et Java en tant que serveur d'applications.

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

(Je l'ai copié 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 s'est produite le un envoi.

Je pense que j'ai essayé toutes les tâches possibles que mes connaissances en C # doivent m'offrir, mais rien ...

105
Kenny Rullo

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

Entrez simplement le nom "Autorisation" et la valeur "Base 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

Commuté le codage de UTF-8 à ISO 8859-1 par Quel codage devrais-je utiliser pour l'authentification HTTP de base? et le commentaire de Jeroen.

210
Zambonilli

Je l'ai enfin eu!

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 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!

48
Kenny Rullo

Si vous pouvez utiliser la classe WebClient, utiliser l'authentification de base 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");
25
Tamir

Essaye ça:

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

Le code suivant résoudra la réponse json si l’authentification de base et le proxy sont implémentés. De même, IIS 7.5 Problème d’hébergement sera résolu.

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

Pour ceux qui utilisent RestSharp , cela peut échouer si vous utilisez SimpleAuthenticator (probablement parce que vous n’utilisez pas ISO-8859-1 en coulisse). J'ai réussi à le faire en envoyant explicitement les 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
Alexei

La spécification peut être lue comme "ISO-8859-1" ou "indéfinie". Votre choix. Il est connu que de nombreux serveurs utilisent ISO-8859-1 (que cela leur plaise ou non) et échouent lorsque vous envoyez autre chose.

Pour plus d'informations et une proposition visant à remédier à la situation, voir http://greenbytes.de/tech/webdav/draft-reschke-basicauth-enc-latest.html

1
Slan

La construction suivante ne fonctionnait pas correctement pour moi:

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

J'ai utilisé CredentialCache à la place:

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

Toutefois, si vous souhaitez ajouter plusieurs informations d'identification d'authentification de base (par exemple, s'il existe une redirection dont vous avez connaissance), vous pouvez utiliser la fonction suivante que j'ai créée:

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

J'espère que cela aidera quelqu'un à l'avenir.

0
Gucu112