it-swarm.com.de

Proxy-Standardauthentifizierung in C #: HTTP 407-Fehler

Ich arbeite mit einem Proxy, der eine Authentifizierung erfordert, d. H. In einem Browser, wenn ich versuche, eine Seite zu öffnen, werden sofort Anmeldeinformationen abgefragt. Ich habe die gleichen Anmeldeinformationen in meinem Programm angegeben, aber es schlägt mit dem HTTP 407-Fehler fehl.

Hier ist mein 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;

Ich habe alles versucht, aber es scheint, als würde mir etwas fehlen. Ist es so, ich muss zwei Anfragen stellen? Erst ohne Anmeldeinformationen und nachdem ich vom Server erfahren habe, dass Anmeldeinformationen erforderlich sind, stellen Sie dieselbe Anforderung mit Anmeldeinformationen?

40
rplusg

hier ist die richtige Art, Proxy zusammen mit creds zu verwenden.

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;

Vielen Dank an alle für die Hilfe ... :)

17
rplusg

Diese Methode kann die Notwendigkeit vermeiden, Proxy-Anmeldeinformationen fest zu codieren oder zu konfigurieren, was wünschenswert sein kann.

Fügen Sie dies in Ihre Anwendungskonfigurationsdatei ein - wahrscheinlich app.config. Visual Studio benennt es beim Erstellen in yourappname.exe.config um und endet neben Ihrer ausführbaren Datei. Wenn Sie keine Anwendungskonfigurationsdatei haben, fügen Sie einfach eine hinzu, indem Sie in Visual Studio Neues Element hinzufügen verwenden.

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

Es kam zu einer sehr ähnlichen Situation, in der HttpWebRequest standardmäßig nicht die korrekten Proxy-Details abrief und das Festlegen der UseDefaultCredentials ebenfalls nicht funktionierte. Das Erzwingen der Einstellungen im Code war jedoch ein Vergnügen:

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

und da hierbei die Standardanmeldeinformationen verwendet werden, sollte der Benutzer nicht nach seinen Details gefragt werden.

23
Carl Onager

Dieses Problem hat mich jahrelang gestört. Die einzige Abhilfe für mich bestand darin, unser Netzwerkteam zu bitten, auf unserer Firewall Ausnahmen zu machen, damit bestimmte URL-Anforderungen nicht auf dem nicht idealen Proxy authentifiziert werden mussten.

Kürzlich habe ich das Projekt von 3.5 auf .NET 4 aktualisiert und der Code hat gerade begonnen, die Standardanmeldeinformationen für den Proxy zu verwenden, keine Hardcodierung von Anmeldeinformationen usw.

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