wake-up-neo.com

HTTP 407-Proxy-Authentifizierung Erforderlich beim Zugriff auf Amazon S3

Ich habe alles versucht, aber ich kann dieses Problem, das nur für einen Client hinter einem Proxy oder einer Firewall eines Unternehmens auftritt, nicht beheben. Unsere Silverlight-Anwendung stellt eine Verbindung zu Amazon S3 her, um einige Dokumente herunterzuladen/hochzuladen. Nur auf einem Client und einem Client wird ein Fehler 407 zurückgegeben, und die Anwendung kann nichts speichern.

Inner Exception:
 System.ServiceModel.ProtocolException: [UnexpectedHttpResponseCode]
Arguments: 407,Proxy Authentication Required

Wir hatten etwas Ähnliches bei einem anderen Kunden, aber es gab mehr Probleme mit CORS. Um dies zu beheben, habe ich Cloud-Front verwendet, um eine Subdomain zu fälschen, die dann auf den S3-Bucket zugreift und das Problem gelöst hat. Ich hatte gehofft, es würde es auch mit diesem Client beheben, aber das tat es nicht.

Ich habe versucht, diesen Code zu web.config hinzuzufügen, wie von vielen Antworten vorgeschlagen

 <system.net>
      <defaultProxy useDefaultCredentials="true" >
      </defaultProxy>
   </system.net>

Ich habe Artikel über das Übergeben eines Proxy-Headers mit Basisauthentifizierung mit Benutzername und Kennwort gelesen, aber ich bin nicht sicher, wie dies uns helfen würde. Der Proxy-Server wird vom Client verwendet und die erforderliche Authentifizierung befindet sich außerhalb unserer Domäne.

**Additional Information**

Der Silverlight-Code verweist auf 2 Dienste. Einer davon ist unser WCF-Service, der alle Daten für die Anwendung abruft. Einer ist der Amazon S3-Dienst, der die Amazon-Soap-API verwendet. Der Endpunkt für diese Option lautet: http://s3.amazonaws.com/doc/2006-03-01/AmazonS3.wsdl ?

Wenn ich in unsere App gehe und nur einen Teil des Systems verwende, bei dem keine Anrufe an die Amazon S3-API erfolgen, funktioniert die Anwendung einwandfrei. Sobald ich zu einem Teil des Systems gehe, der den S3 anruft, beginnt das Problem. komischerweise geht der Anruf an S3 gut und ich kann das Dokument abrufen, aber dann rufen alle Anrufe an unseren Wcf-Dienst 407 zurück.

Irgendwelche Ideen? 

**Update 2**

Basierend auf den Kommentaren von Elliot Nelson überprüfe ich den Stack, den wir für HTTP-Anfragen in unserer Anwendung verwendet haben. Es stellt sich heraus, dass wir standardmäßig den Client http für HTTP- und https-Anforderungen verwenden. Hier ist der Code, den wir im App.xaml-Konstruktor haben

  public App()
        {
            Startup += Application_Startup;
            UnhandledException += Application_UnhandledException;

            InitializeComponent();

            WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
            WebRequest.RegisterPrefix("https://", WebRequestCreator.ClientHttp);

        }

Um nun die Unterschiede zwischen clienthttp und browserhttp zu verstehen und wann sie verwendet werden. Auch die möglichen Auswirkungen/Probleme der Umstellung auf browserhttp.

**Update 3**

Gibt es eine Möglichkeit, Browser anzufordern, Ihre Silverlight-Anwendung im Browser im vertrauenswürdigen Modus auszuführen, und würde dies helfen, dieses Problem zu umgehen?

6
Abhi.Net

(Antwort 2)

Wahrscheinlich kann (für Unternehmensumgebungen wie dieses Netzwerk) fast nichts getan werden, ohne dass die benutzerdefinierten Proxy-Einstellungen im IE festgelegt werden, die normalerweise von den Unternehmensrichtlinien vorgegeben werden. Um diese Proxy-Einstellungen zu nutzen, möchten Sie WebRequestCreator.BrowserHttp Verwenden, das bei Anfragen automatisch die Standardeinstellungen des Browsers verwendet.

Es gibt eine Tabelle mit den Unterschieden zwischen diesen beiden Clients in den Microsoft-Dokumenten . Vermutlich haben Sie etwas verwendet (z. B. benutzerdefinierte Header festgelegt oder den unverarbeiteten Antworttext gelesen), das in BrowserHttp nicht unterstützt wird.

Aus Sicherheitsgründen können Sie den Browser nicht nach den Proxy-Einstellungen fragen und diese verwenden. Dies ist eine schwierige Situation. Sie können die Behandlung zwischen Browser und Client nach Domäne oder sogar für eine bestimmte Anforderung festlegen (auf derselben Seite wird beschrieben, wie). In diesem Fall können Sie möglicherweise nicht mehr nur ClientHttp für Ihre Serviceaufrufe und BrowserHttp für Ihre S3-Anrufe verwenden und das Problem vollständig vermeiden.

Für die nächsten Schritte würde ich diesen Ansatz ausprobieren. Wenn es nicht funktioniert, würde ich versuchen, auf BrowserHttp umzuschalten, um zu sehen, ob das Proxy-Problem umgangen wird tatsächlich funktionieren, da Sie wahrscheinlich nur ClientHttp-Optionen verwenden).

Langfristig möchten Sie möglicherweise Änderungen an Ihren Diensten vornehmen, damit diese von einer Nur-BrowserHttp-Anwendung verwendet werden können (dies würde erfordern, dass Sie bei Ihren Anforderungen/Antworten ziemlich einfach sind, aber die Verwendung von Nur-BrowserHttp wäre eine Garantie dafür, dass Sie funktionieren in so ziemlich jedem Konzernnetz).

2
Elliot Nelson

Das Ausführen im vertrauenswürdigen Modus ist wahrscheinlich eine Gruppenrichtlinie, für die die AD-Administratoren Ihre App genehmigen bzw. eine Whitelist hinzufügen müssen. 

Ich denke, das zugrunde liegende Problem ist, dass der Proxy eine NTLM-Authentifizierung erfordert, und aus irgendeinem Grund lehnt der Browser die App mit diesem Kontext ab. 

Eine Möglichkeit zu beweisen, dass es sich um ein NTLM-Authentifizierungsproblem handelt, ist das Testen mit curl. Lassen Sie es durch den Proxy eine Anforderung stellen, dann sollte es etwas einfacher sein, Code zu schreiben. ZB die folgende Locke führt Sie durch 99% der Windows-Unternehmens-Proxys (vorausgesetzt, der Proxy befindet sich im Proxy-Host.corp: 3128):

C:\> curl.exe -v --proxy proxy-Host:3128 --proxy-user : --proxy-ntlm https://www.google.com

NOTEDer --proxy-user : weist curl an, die aktuelle Benutzersitzung zur Durchführung der NTLM-Abfrage zu verwenden.

Wenn Sie also den Client dazu bringen können, das auszuführen, können Sie zumindest feststellen, dass NTLM funktioniert. Es ist nur eine Frage der App, die NTLM-Abfrage mit den Standardanmeldeinformationen auszuführen (die möglicherweise vom Browser bereitgestellt werden oder nicht) Session) 

2
stringy05

Da Sie dies als Silverlight-Anwendung beschrieben haben, kann ich nicht davon ausgehen, dass Sie die klassische Browser-Proxy-Problembehandlung wie "Browser in öffentliches Netzwerk verschieben" oder "Versuchen Sie es mit einem anderen Browser" ausführen können, um das Problem zu isolieren.

Sie sollten versuchen, den Proxy-Server zu isolieren, und der Kunde muss die erforderliche Proxy-Authentifizierung verwenden.

Die Anwendung stellt eine Anforderung, kann jedoch von einem transparenten Proxy abgefangen werden oder das Ergebnis könnte von einem für Sie als Webserver erachteten Server stammen.

In der Anfangszeit war der 401-Fehler ziemlich eng mit web-auth verbunden, und 407 war für Proxy-auth. 

Architektonisch ist die Trennung eine Annehmlichkeit, ein Webserver kann sowohl Webserver-, Proxy- als auch Reverseproxy-Verhalten aufweisen. 

Was passiert, ist, dass die Umgebung Ihres Kunden eine Internetverbindung zum Ziel herstellt, aber er erhält den Status HTTP 407 von einem Host, wahrscheinlich seinem Netzwerk oder manchmal dem Anbieter. Fast sicher wird die Anfrage nicht weitergeleitet. Der HTTP-Client, in dem sich Ihre Anwendung befindet, muss die von Host benötigten Anmeldeinformationen bereitstellen. Unternehmen verfügen über komplexe Umgebungen, in denen Ihr Kunde oft sagt, dies sei das erste Mal, dass sie davon gehört haben (einige Proxy-Auth sind auch dynamisch oder zielspezifisch).

In einigen Unternehmensumgebungen lässt der Betreiber außerdem temporäre oder permanente White-Listings vom Proxy-Auth-Dienst zu. Sie sollten sehen, ob sie dies auch nur vorübergehend tun können, um zu bestätigen, dass es keine anderen Probleme gibt.

Am Ende scheint es, als würde Ihre Anwendung Proxy-Auth oder den Proxy-Auth-Typ, den sie in ihrer Umgebung verwenden, nicht zuverlässig unterstützen. 

0
benc