2010-09-14 20 views
1

J'essaie de me connecter à un service Web qui utilise l'authentification Kerberos pour autoriser l'utilisateur, mais tout ce que je reçois est un 401 non autorisé chaque fois que j'essaie de faire la demande. Voici le code que j'utilise. Merci d'avance pour toute aide que vous pouvez fournir!ASP.NET HttpWebRequest avec l'authentification Kerberos

public XPathNavigator GSASearch(string url, string searchString) 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + searchString); 
     request.CookieContainer = new CookieContainer(); 
     request.Credentials = CredentialCache.DefaultCredentials; 
     request.ContentType = "text/xml"; 
     request.Method = "POST"; 

     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

     Stream receiveStream = response.GetResponseStream(); 

     XPathDocument doc = new XPathDocument(receiveStream); 
     return doc.CreateNavigator(); 
    } 

EDIT: Je pense que je devrais expliquer un peu plus ce que je tente de faire. J'ai été chargé de fournir une nouvelle interface pour Google Search Appliance de mon entreprise. J'utilise une page ASP.NET, qui fait certaines choses comme choisir une collection en fonction de l'emplacement d'un utilisateur, etc., puis envoie la chaîne de recherche appropriée au GSA. Tout fonctionnait bien jusqu'à ce qu'ils décident d'activer l'authentification, et maintenant je ne peux obtenir aucun résultat (soit je reçois un 401 non autorisé, soit un message indiquant que 'les données au niveau de la racine ne sont pas valides'). Si je prends la chaîne de recherche et la fournisse directement à la GSA, elle s'authentifie correctement et affiche les résultats, je n'arrive pas à l'obtenir via HttpWebRequest.

EDIT 2: J'ai fait un peu plus de recherche (a couru la demande par l'intermédiaire de Fiddler) et il semble que la demande essaye seulement de négocier et pas Kerberos. Je mets les pouvoirs d'utiliser explicitement Kerberos comme ci-dessous, mais il n'a pas aidé ...

public XPathNavigator GSASearch(string url, string searchString) 
    { 
     CredentialCache credCache = new CredentialCache(); 
     credCache.Add(new Uri(url), "Kerberos", CredentialCache.DefaultNetworkCredentials); 

     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + searchString); 
     request.CookieContainer = new CookieContainer(); 
     request.PreAuthenticate = true; 
     request.Credentials = credCache; 
     request.ContentType = "text/xml"; 
     request.Method = "POST"; 

     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

     Stream receiveStream = response.GetResponseStream(); 

     //StreamReader readStream = new StreamReader(receiveStream); 

     XPathDocument doc = new XPathDocument(receiveStream); 
     return doc.CreateNavigator(); 
    } 

EDIT 3: Ok, regardant de plus près encore, les CredentialCache.DefaultCredentials ne semble pas avoir mes lettres de créance de réseau en ...

+0

Vous n'avez pas mentionné où vous exécutez votre client. Est-ce une application de console, une application aspx, etc? – feroze

+0

Désolé ... c'est une application aspx –

+0

Je suppose que vous n'avez pas la configuration d'Active Directory correctement ... il y a quelques paramètres de confiance qui doivent être réglés entre les deux serveurs –

Répondre

0

1) Avez-vous fait une trace de connexion réussie vers le GSA en utilisant le navigateur? Est-ce que ça marche?

2) Si # 1 fonctionne, quel est l'en-tête WWW-Authenticate envoyé par le GSA sur la première requête non authentifiée?

3) La machine sur laquelle l'application ASPX s'exécute fait-elle partie du même domaine AD que le GSA? AFAIK c'est probablement nécessaire pour une authentification réussie. 4) Ensuite, puisque c'est l'application ASPX qui effectue la requête, vous ne pouvez pas utiliser DefaultCredentials car vous avez réellement besoin des informations d'identification d'un utilisateur approuvé par le GSA. Pour cela, vous devez créer un compte d'utilisateur spécial pour l'application qui parle au GSA ou chaque utilisateur doit être un utilisateur de confiance sur le GSA et avoir la page ASPX d'abord authentifier l'utilisateur, puis transmettre ces informations au GDA en utilisant la délégation. . Pour cela, vous devrez également faire en sorte que le serveur exécutant l'application ASPX soit approuvé pour la délégation. À mon avis, vous devriez d'abord modéliser votre code dans une application de console que vous exécutez et déboguer. Puis le porter sur la page ASPX. De cette façon, vous serez en mesure de savoir si l'échec est dû à l'hôte (ASPX vs console) ou autre chose.

+0

Ok, juste découvert un nouveau hoquet en essayant l'étape 1 avec fiddler ... il doit se connecter à un lien https: //, au lieu de http: //. J'ai essayé de changer mon URL de connexion à https: // mais cela n'a pas vraiment fait de différence (en fait, le https: // url fonctionne toujours avec les appels non authentifiés à la GSA, donc je doute vraiment que ce soit le problème). Je ne sais pas si cela affectera les autres étapes que vous avez fournies. –

+0

En utilisant fiddler, lorsque je fais une tentative réussie directement à partir de la GSA, je ne vois pas de WWW-Authenticate dans les informations d'en-tête. –

+0

Sur # 3, oui, ils sont sur le même domaine. –