web-dev-qa-db-fra.com

Authentification proxy HTTP 407 requise lors de l'accès à Amazon S3

J'ai tout essayé mais je n'arrive pas à résoudre ce problème qui ne se produit que pour un client derrière un pare-feu/proxy. Notre application Silverlight se connecte à Amazon S3 pour télécharger/télécharger certains documents. Sur un client et un client seulement, une erreur 407 est renvoyée et l'application échoue ensuite.

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

Nous avions quelque chose de similaire chez un client différent, mais il y avait plus d'un problème de la SCRO. Pour résoudre ce problème, j'ai utilisé cloud-front pour simuler un sous-domaine qui accède ensuite au compartiment S3, ce qui a résolu le problème. J'espérais que cela réglerait le problème avec ce client également, mais cela ne s'est pas produit.

J'ai essayé d'ajouter ce code à web.config comme suggéré par beaucoup de réponses

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

J'ai lu des articles sur le passage d'un en-tête de proxy avec une authentification de base à l'aide d'un nom d'utilisateur et d'un mot de passe, mais je ne sais pas comment cela pourrait nous aider. Le serveur proxy est utilisé par le client et toute authentification requise est en dehors de notre domaine.

**Additional Information**

Le code Silverlight fait référence à 2 services. Le premier est notre service wcf qui récupère toutes les données de l’application. Le premier est le service Amazon S3 qui utilise l’API Amazon Soap, dont le point de terminaison est situé à http://s3.amazonaws.com/doc/2006-03-01/AmazonS3.wsdl ?

Si je vais dans notre application et n'utilise qu'une partie du système qui ne fait aucun appel à l'API Amazon S3, l'application fonctionne correctement. Dès que je me rends dans une partie du système qui appelle le S3, le problème commence. Curieusement, l’appel à S3 se passe bien et je peux récupérer la doc, mais tous les appels de notre service wcf renvoient le numéro 407.

Des idées? 

**Update 2**

Sur la base des commentaires de Elliot Nelson, je vérifie la pile que nous utilisions pour effectuer des requêtes http dans notre application. Il s'avère que nous utilisons le client http pour les requêtes http et https par défaut. Voici le code que nous avons dans le constructeur App.xaml

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

            InitializeComponent();

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

        }

Maintenant, pour comprendre les différences entre clienthttp et browserhttp et quand les utiliser. En outre, les impacts/problèmes potentiels du passage à browserhttp.

**Update 3**

Existe-t-il un moyen de demander aux navigateurs d’exécuter votre application Silverlight intégrée au navigateur en mode sécurisé et cela aiderait-il à éviter ce problème?

6
Abhi.Net

(Réponse n ° 2)

Donc, très probablement (pour les environnements d'entreprise tels que ce réseau), presque rien ne peut être fait sans les paramètres de proxy personnalisés définis dans IE, généralement poussés par la stratégie d'entreprise. Pour tirer parti de ces paramètres de proxy, vous souhaitez utiliser WebRequestCreator.BrowserHttp, qui utilise automatiquement les paramètres par défaut du navigateur lors de la création de demandes.

Il existe un tableau des différences entre ces deux clients disponibles dans les documents Microsoft . J'imagine que vous utilisiez quelque chose (peut-être définir des en-têtes personnalisés ou lire le corps de réponse brut) qui n'était pas pris en charge dans BrowserHttp.

Pour des raisons de sécurité, vous ne pouvez pas "demander" au navigateur quels sont ses paramètres de proxy et les utiliser. Il s'agit donc d'une situation délicate. Vous pouvez spécifier la gestion du navigateur par rapport au client par domaine, ou même pour une demande spécifique (la même page ci-dessus décrit comment); dans ce cas, vous pourrez peut-être vous contenter d’utiliser ClientHttp pour vos appels de service et BrowserHttp pour vos appels S3, tout en évitant le problème!

Pour les prochaines étapes, j'essaierais cette approche; si cela ne fonctionne pas, j'essayerais de passer en gros à BrowserHttp juste pour voir s'il contourne le problème du proxy (il n'y a presque aucune chance que l'application fonctionne réellement, car vous utilisez probablement les options uniquement ClientHttp) .

À long terme, vous voudrez peut-être envisager de modifier vos services pour qu'ils soient utilisables par une application uniquement BrowserHttp (cela vous obligerait à être assez simple dans vos demandes/réponses, mais utiliser uniquement BrowserHttp serait une garantie de votre efficacité. dans à peu près n'importe quel réseau de corp).

2
Elliot Nelson

L'exécution en mode sécurisé est probablement une politique de groupe qui obligerait leurs administrateurs AD à approuver/ajouter à la liste blanche votre application. 

Je pense que le problème sous-jacent auquel vous faites face est que le proxy requiert une authentification NTLM et, pour une raison quelconque, le navigateur refuse de fournir ce contexte à votre application. 

Une façon de prouver qu’il s’agit d’un problème d’authentification NTLM consiste à tester avec curl - qu’il produise un req via le proxy, il devrait alors être un peu plus facile à coder. Par exemple, la boucle suivante vous permettra de passer à travers 99% des procurations d'entreprise Windows (en supposant que le proxy est à proxy-Host.corp: 3128):

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

NOTELe --proxy-user : indique à Curl d'utiliser la session utilisateur en cours pour exécuter le défi NTLM.

Donc, si vous pouvez faire en sorte que le client l'exécute, vous pouvez au moins identifier le fonctionnement de NTLM. Il suffit simplement à l'application de relever le défi NTLM à l'aide des informations d'identification par défaut (fournies ou non par le navigateur). session) 

2
stringy05

Puisque vous avez décrit cela comme une application silverlight, je vais supposer que vous ne pouvez pas utiliser le dépannage classique de mandataire de navigateur tel que "déplacer le navigateur sur un réseau public" ou "essayer un autre navigateur" pour isoler le problème.

Vous devez essayer d’isoler le serveur proxy et demander au client d’utiliser l’autorisation proxy requise.

L'application est en train de faire une demande, mais elle peut être interceptée par un proxy transparent ou le résultat peut provenir de ce que vous considérez comme un serveur Web.

Dans les premiers temps, l'erreur 401 était plutôt étroitement associée à web-auth, et 407 à proxy-auth. 

Sur le plan architectural, la séparation est pratique, un serveur Web peut avoir à la fois des comportements de serveur Web, de proxy et de proxy inverse. 

Ce qui se passe, c’est que l’environnement de votre client établit une connexion Web avec la destination, mais il reçoit le statut HTTP 407 de certains hôtes, probablement leur réseau ou parfois le fournisseur. Presque certainement, la demande est reçue non transmise. Le client HTTP dans lequel votre application vit doit fournir les informations d'identification requises par l'hôte. Les entreprises ont des environnements suffisamment complexes, où souvent vos clients diront que c'est la première fois qu'ils entendent parler de cela (certains proxy-auth sont également dynamiques ou spécifiques à une destination).

De plus, dans certains environnements d'entreprise, l'opérateur autorisera une liste blanche temporaire ou permanente du service proxy-auth. Vous devriez voir s’ils peuvent le faire, même temporairement, pour confirmer qu’il n’y aura pas d’autres problèmes.

En fin de compte, il semble que votre application risque de ne pas prendre en charge correctement proxy-auth ou le type de proxy-auth qu'elles utilisent dans leur environnement. 

0
benc