HTTP 407 (Authentification du Proxy Requise)

J'ai quelques questions de base sur l'authentification HTTP

1) Comment fonctionne le client sait à propos du Serveur d'authentification de type (de Base/Digest/NTLM) de HTTP ?
est-ce configurables à l'adresse HTTP du Serveur de côté?

Ma Réponse: Serveur sera mis à laquelle le type d'authentification, il doit effectuer avec le client.
Donc, notre client API(en C# HttpWebRequest API) va automatiquement prendre soin d'elle.
La meilleure utilisation de Wireshrk avec l'application du filtre HTTP; vous obtiendrez IP source et de Destination à Internet Protocol layer. Et src et dest port au protocole de contrôle de Transmission et athentication type à couche http.

2) Si je place le calmar linux proxy entre le client et le Serveur; est-il besoin de mon code client doit connaître le type d'authentification de proxy? ou le type d'authentification est uniquement lié à la fin du serveur HTTP?

Ma Réponse: Si proxy squid est placé entre le Client et le Serveur; il l'habitude d'utiliser l'authentification HTTP. Il peut utiliser a) DB: Utilise une base de données SQL b) LDAP: Utilise le Lightweight Directory Access Protocol. c) RAYON: Utilise un serveur RADIUS pour l'ouverture de validation. et etc..
Donc, nous devons mentionner les informations d'authentification proxy dans les en-Têtes HTTP.

3) à l'Aide de WireShark trouve qu'il y a trois demande du Navigateur au Serveur pour répondre à la demande simple.

un Navigateur envoie une requête sans informations d'authentification; Donc le serveur a répondu avec 401 avec relam et nonce.

WWW-Authenticate: Digest realm="realm", qop="auth", nonce="MTM1OTYyMzkyNDU4MzpiOWM0OWY0NmMzMzZlMThkMDJhMzRhYmU5NjgwNjkxYQ=="\r\n <BR>

b) La deuxième fois, le Navigateur envoie une requête avec des informations d'identification, relam, nonce, cnonce; mais encore serveur a répondu avec 401;

WWW-Authenticate: Digest realm="realm", qop="auth", nonce="MTM1OTYyMzk0OTAyMTo3Njk3MDNhZTllZDQyYzQ5MGUxYzI5MWY2MGU5ZDg0Yw==", stale="true"\r\n

c) La troisième fois Navigateur envoyer la même demande avec les mêmes informations d'identification, relam, nonce, cnonce. Cette fois, le Serveur envoie 200 ok.

Ma Question est dans le deuxième et le troisième temps de Navigateur d'envoyer la même demande; pourquoi le Serveur a échoué à la deuxième temps et le succès à la troisième fois. Est-ce à cause de mon serveur de mise en œuvre ? (Je suis en REPOS serveur Java avec SPRING Security filter).

J'ai le C# client HTTP;

où dans les premiers temps HttpWebRequest est envoyé sans informations d'identification si le Système.Net.NetworkCredentials est réglé; alors clinet ai 407 avec relam, et le nonce.
La deuxième fois HttpWebRequest est scuccess. Il n'y a pas de troisième demande du client comme navigateur.

Pourquoi cette différence entre le navigateur et le client C#?

Ma Réponse: je suis ne sais toujours pas ce qui se passe ici: T3.

4) Maintenant, la vraie question que je pose est Quand CALMAR LINUX PROXY entre le Client et le Serveur HTTP, le Navigateur fait la même demande d'authentification et réussi. Cependant, C# HttpWebRequest est échoué (401) à la deuxième demande et a atteint le cache(exception){} bloc et de ne pas essayé pour la troisième fois.

Pourriez vous s'il vous plaît quelqu'un me préciser comment résoudre ce problème en C# client lorsque le SERVEUR PROXY est entre les deux?

Code ci-dessous est en train de faire la Requête GET.

  HttpWebRequest request = WebRequest.Create("url") as HttpWebRequest;
  request.Credentials = new NetworkCredential(loginUserName, password);
  WebResponse response = request.GetResponse(); 

Noter que notre demande de procuration est de les envoyer via le protocole TCP pas avec le protocole HTTP. Puis, à partir de PROXY SERVER est communiquée avec le protocole HTTP.
Mais la requête HTTP à partir de Proxy a l'info au sujet de notre client ip dans l'en-tête HTTP X-Forwarded-For.

Ci-dessous sont les solutions possibles

Ces solutions requis uniquement si votre proxy requiert une authentification d'autre de l'ignorer.

Solution 1: travailler pour moi

request.Proxy.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;

Solution 2:

  IWebProxy proxy = WebRequest.GetSystemWebProxy();
  proxy.Credentials = new NetworkCredential(UserName, UserPassword, UserDomain);
  request.Proxy = proxy;

la Solution 3 donnée par Martin:

  var proxy = new WebProxy ("http://localhost:3128/");
  proxy.Credentials = new NetworkCredential (UserName, UserPassword, UserDomain);
  request.Proxy = proxy;

En savoir plus sur l'authentification du proxy à
http://wiki.squid-cache.org/Features/Authentication

Lorsque l'on regarde les réponses à l'aide de wireshark, inspecter les en-têtes http envoyés par le serveur. Ces dire au navigateur que faire (pour l'authentification de Base, le serveur comprend WWW-Authenticate: Basic realm="realm" par exemple)
Ok Merci!, Pourriez-vous répondre à mes autres questions?
C'est pourquoi je n'ai pas posté mon commentaire à la réponse - je ne peux pas répondre complètement à votre question, mais pensé qu'il serait peut-être vous aider un peu quand même.

OriginalL'auteur Kanagavelu Sugumar | 2013-02-01