2009-05-29 7 views
7

Mon application ASP.NET 2.0 crée un HTTPWebRequest sur un site de l'intranet d'une entreprise, qui utilise l'authentification NTLM. Les références transmises sont pour un compte de service, qui est authentifié sur le domaine avec succès (le journal de sécurité confirme)HttpWebRequest authentifié avec redirection, informations d'identification persistantes?

Certains code abrégé suit ..

HttpWebRequest req = WebRequest.Create(queryUrl) as HttpWebRequest; 
NetworkCredential cred = new NetworkCredential(username, 
       pwd, domain); 
req.Credentials = cred; 

HttpWebResponse response = req.GetResponse() as HttpWebResponse; 

Dans le cadre de la demande, il y a un couple des redirections (dans le même domaine) à la réponse finale - qui est gérée OK sur ma machine de développement (Windows 2k)

Lorsque cette demande est créée à partir de mon environnement de déploiement (Windows 2k3), j'obtiens une erreur 401 non autorisée à partir du site, apparemment après le premier code de redirection est retourné (301 déplacé), et ma demande objec t tente de suivre la redirection.

Donc, fondamentalement, quelqu'un sait-il des problèmes entourant HttpWebRequests authentifiés qui suivent des redirections? La solution évidente consiste simplement à demander la redirection de la page, mais les administrateurs en charge du site intranet veulent surveiller l'utilisation de mon application en me redirigeant vers une page spécifique.

+0

Avez-vous regardé votre trafic réseau (par exemple avec Fiddler) pour voir si le client fait toute tentative d'authentification du client à l'objectif final de la redirection? L'échec de l'authentification automatique sur le serveur redirigé peut constituer une mesure de sécurité dans .NET pour empêcher toute fuite accidentelle des informations d'identification. – EricLaw

+0

Je suis confronté au même problème et toujours pas en mesure de comprendre le problème. http: // stackoverflow.com/questions/3562979/make-a-web-request-to-a-page-web-which-requires-windows-authentication –

Répondre

11

Pour réutiliser des informations d'identification sur des redirections, vous devez utiliser un cache d'informations d'identification. Si vous affectez simplement un objet NetworkCredentials, il ne sera utilisé qu'à la première demande.

est un exemple:

HttpWebRequest req = WebRequest.Create(queryUrl) as HttpWebRequest; 
NetworkCredential cred = new NetworkCredential(username, pwd, domain); 
var cache = new CredentialCache {{queryUrl, "Ntlm", cred}}; 
req.Credentials = cache; 
HttpWebResponse response = req.GetResponse() as HttpWebResponse; 
1

Cela va dépendre de la façon dont votre auth. régime fonctionne. Les informations d'identification réseau vont seulement aider à la partie NTLM de if. Je suppose que le site auquel vous essayez d'accéder utilise également l'authentification par formulaire. Si tel est le cas, lorsque vous vous connectez, vous devriez obtenir un cookie auth, vous devrez l'inclure dans les requêtes suivantes, par ex. après une redirection. Je pense que l'objet WebRequest possède une collection d'en-têtes que vous pouvez utiliser pour contenir le cookie. Cela peut être une bonne idée d'utiliser fiddler ou firebug pour voir ce qui se passe lorsque vous naviguez normalement.

-1

Si vous utilisez NTLM, ceci est le problème 2 houblon classique. Cela fonctionne sur votre machine dev car le client et le serveur sont sur la même case et les informations d'identification sont passées au plus une fois (à la machine cible finale que je devine)

Lorsque vous déployez dans votre environnement prod, 3 machines sont impliquées. Le navigateur client transmet les informations d'identification au serveur1, puis le serveur1 essaie de transmettre les informations d'identification au serveur2, ce qui n'est pas autorisé. Une solution consiste à implémenter l'authentification Kerberos (un protocole plus strict) qui permettra à server1 de transmettre les informations d'identification au serveur2

+0

Merci Tion, mais je ne pense pas que ce soit le problème dans ce cas - l'objet credentials est pour un compte séparé à l'utilisateur connecté à mon application, donc il y a seulement un saut impliqué - j'aurais dû mentionner cela vraiment :) C'est le fait qu'il y a une redirection transparente impliqué dans l'obtention de la réponse du serveur qui est apparemment le problème, si je spécifie l'URL final au lieu de celui qui redirige, tout fonctionne ... –

Questions connexes