Authentification de base par procuration dans l'erreur c#: HTTP 407

je travaille avec un proxy qui nécessite une authentification, c.-à-d., Dans un navigateur si j'essaie d'ouvrir une page, il demandera immédiatement des justificatifs 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é toutes les choses possibles mais il semble que je manque quelque chose. Est-il quelque chose comme, je dois faire deux demandes? Tout d'abord, sans justificatifs d'identité et une fois que j'ai eu des nouvelles du serveur sur le besoin de justificatifs d'identité, faire la même demande avec des justificatifs d'identité?

36
demandé sur Nicolas Raoul 2012-03-07 18:16:17

5 réponses

cette méthode peut éviter le besoin de coder dur ou de configurer les justificatifs d'identité de proxy, ce qui peut être souhaitable.

Mettez ceci dans votre fichier de configuration d'application - probablement app.config. Visual Studio va le renommer en yourappname.EXE.config on build, et il finira à côté de votre exécutable. Si vous n'avez pas de fichier de configuration d'application, il vous suffit d'en ajouter 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>
73
répondu tomfanning 2012-08-22 16:04:40

j'obtenais une situation très similaire où le HttpWebRequest ne récupérait pas les bons détails de proxy par défaut et paramétrait les UseDefaultCredentials qui ne fonctionnaient pas non plus. Forcer les paramètres dans le code a toutefois fonctionné un treat:

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 parce qu'il utilise les informations d'identification par défaut, il ne devrait pas demander à l'utilisateur ses coordonnées.

22
répondu Carl Onager 2015-05-29 09:06:14

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

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 tout le monde pour obtenir de l'aide... :)

18
répondu rplusg 2015-12-01 10:26:20

ce problème m'avait mis sur écoute pendant des années la seule solution pour moi était de demander à notre équipe réseaux de faire des exceptions sur notre pare-feu afin que certaines requêtes URL n'aient pas besoin d'être authentifiées sur le proxy qui n'est pas idéal.

récemment j'ai mis à jour le projet à .NET 4 à partir de 3.5 et le code vient de commencer à travailler en utilisant les justificatifs d'identité par défaut pour le proxy, pas de codage dur des justificatifs d'identité, etc.

request.Proxy.Credentials = CredentialCache.DefaultCredentials;
3
répondu Robbo 2015-05-21 12:09:40

essayez ceci

        var YourURL = "http://yourUrl/";

         HttpClientHandler handler = new HttpClientHandler() 
         { 
             Proxy = new WebProxy("http://127.0.0.1:8888"), 
             UseProxy = true, 
         }; 

         Console.WriteLine(YourURL); 

         HttpClient client = new HttpClient(handler); 
-1
répondu sansalk 2015-11-05 16:09:18