web-dev-qa-db-fra.com

Authentification de base proxy en C #: erreur HTTP 407

Je travaille avec un proxy qui requiert une authentification, c’est-à-dire que si je tente d’ouvrir une page dans un navigateur, il demande immédiatement des informations d’identité. J'ai fourni les mêmes informations d'identification dans mon programme mais il échoue avec l'erreur HTTP 407.

Voici mon code:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);

IWebProxy proxy = WebRequest.GetSystemWebProxy();
CredentialCache cc = new CredentialCache();
NetworkCredential nc = new NetworkCredential();

nc.UserName = "userName";
nc.Password = "password";
nc.Domain = "mydomain";
cc.Add("http://20.154.23.100", 8888, "Basic", nc);
proxy.Credentials = cc;
//proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
request.Proxy = proxy;
request.Proxy.Credentials = cc;
request.Credentials = cc;
request.PreAuthenticate = true;

J'ai essayé tout ce qui était possible mais il me semble que quelque chose me manque. Est-ce quelque chose comme, je dois faire deux demandes? D'abord avec les informations d'identification et une fois que le serveur me dit qu'il a besoin d'informations d'identification, faire la même demande avec les informations d'identification?

40
rplusg

voici la bonne façon d'utiliser proxy avec cred ..

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);

IWebProxy proxy = request.Proxy;                    
if (proxy != null)
{
    Console.WriteLine("Proxy: {0}", proxy.GetProxy(request.RequestUri));
}
else
{
    Console.WriteLine("Proxy is null; no proxy will be used");
}

WebProxy myProxy = new WebProxy();
Uri newUri = new Uri("http://20.154.23.100:8888");
// Associate the newUri object to 'myProxy' object so that new myProxy settings can be set.
myProxy.Address = newUri;
// Create a NetworkCredential object and associate it with the 
// Proxy property of request object.
myProxy.Credentials = new NetworkCredential("userName", "password");
request.Proxy = myProxy;

Merci à tous pour l'aide ... :)

17
rplusg

Cette méthode peut éviter de coder en dur ou de configurer les informations d'identification du proxy, ce qui peut être souhaitable.

Mettez ceci dans le fichier de configuration de votre application - probablement app.config. Visual Studio le renommera yourappname.exe.config lors de la génération et se retrouvera à côté de votre exécutable. Si vous n'avez pas de fichier de configuration d'application, ajoutez-en un en utilisant Ajouter un nouvel élément dans Visual Studio.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.net>
    <defaultProxy useDefaultCredentials="true" />
  </system.net>
</configuration>
76
tomfanning

Je devenais dans une situation très similaire où HttpWebRequest ne récupérait pas les détails de proxy corrects par défaut et la définition de UseDefaultCredentials ne fonctionnait pas non plus. Forcer les paramètres dans le code a cependant fonctionné comme une gâterie:

IWebProxy proxy = myWebRequest.Proxy;
if (proxy != null) {
    string proxyuri = proxy.GetProxy(myWebRequest.RequestUri).ToString();
    myWebRequest.UseDefaultCredentials = true;
    myWebRequest.Proxy = new WebProxy(proxyuri, false);
    myWebRequest.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
}

et comme il utilise les informations d'identification par défaut, il ne devrait pas demander à l'utilisateur de fournir ses coordonnées.

23
Carl Onager

Ce problème me perturbait depuis des années. La seule solution pour moi consistait à demander à notre équipe des réseaux de faire des exceptions sur notre pare-feu afin que certaines demandes d’URL n’aient pas besoin d’être authentifiées sur le proxy, ce qui n’était pas idéal.

Récemment, j'ai mis à niveau le projet vers .NET 4 à partir de la version 3.5 et le code a simplement commencé à fonctionner à l'aide des informations d'identification par défaut du proxy, sans codage en dur des informations d'identification, etc.

request.Proxy.Credentials = CredentialCache.DefaultCredentials;
3
Robbo