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
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
Vous devez vous connecter pour publier un commentaire.
C'est un protocole de stimulation/réponse. Généralement, le client fait une demande initiale, sans en-têtes d'authentification (vous pouvez définir
request.PreAuthenticate = true
pour envoyer les informations d'identification avec la première demande).Ensuite, le serveur répond avec une liste de méthodes d'authentification prises en charge.
Si l'utilisateur n'a pas explicitement spécifier une méthode d'authentification à l'aide de
CredentialsCache
, le runtime de les essayer toutes, de la plus forte à la plus faible. Certains protocoles (NTLM, par exemple) nécessitent de multiples demandes du client vers le serveur. En théorie, le résumé devrait fonctionner avec un seul, aucune idée de pourquoi c'est l'envoi de la demande deux fois.Au sujet de votre proxy question, il y a deux différents types d'authentification:
Vous spécifiez à l'aide de
et puis
ou
De ne pas définir d'informations d'identification sur le
WebProxy
si votre serveur proxy ne pas utiliser toute authentification.Si vous ne pouvez pas obtenir l'authentification de travail lors de l'utilisation d'un serveur proxy, voir les demandes qui sont envoyés entre les trois parties (serveur web, proxy, client), avec Wireshark.
Si le proxy permet de demander appelé par les Navigateurs, vous devez ajouter de la chaîne de l'agent utilisateur à votre Demande d'exp: demande.UserAgent="Mozilla/5.001 (windows; U; NT4.0; en-US; rv:1.0) Gecko/25250101"; sinon, Il sera de retour d'Erreur 403 - Forbidden
OriginalL'auteur Martin Baulig