2010-08-06 14 views
1

Nous développons de nombreux services WCF hébergés dans IIS. (IIS 6.0 s'exécutant sur Windows Server 2003 SP2). Ces services sont configurés pour REST. Pour un environnement (DEV, CERT, PROD), nous avons généralement de nombreux services par serveur IIS. Chaque service a son propre compte de connexion attribué via le pool d'applications. Cela fonctionne très bien, mais si nous activons l'authentification Windows sur le répertoire virtuel (pour permettre le passage du contexte utilisateur, pas pour l'usurpation d'identité ou la délégation), nous obtenons des erreurs de sécurité dans des cas spécifiques. Si nous nous connectons au service en code C# en utilisant ServiceEndpoint, cela fonctionne, cependant lorsque nous nous connectons aux services via un navigateur ou un code non Wcf (par exemple HttpWebRequest, java, et al), nous obtenons les erreurs de sécurité.Comment utiliser les noms de machines dans les services WCF avec REST avec l'authentification Windows

Si je modifie l'authentification dans IIS de Negotiate, NTLM à NTLM seulement, alors cela fonctionne. En réalité, nous désactivons Kerberos et, comme ces services communiquent avec d'autres serveurs du réseau, nous commençons à rencontrer d'autres problèmes empêchant les services de se connecter aux serveurs distants (en général, les serveurs SQL).

Maintenant, voici la partie bizarre, si nous donnons à la machine un alias DNS (enregistrement CNAME) et utilisons l'URL avec l'alias, il fonctionne. par exemple.

http://dnsalias/service/myservice.svc/foo WORKS! 
but 
http://machinename/service/myservice.svc/foo FAILS :(

Nous ne pouvons pas donner toutes ces machines alias DNS (qui a été notre solution à ce point) parce que nous commençons à utiliser des machines virtuelles abondamment et les tourner de haut en bas. Nous n'avons donc que des noms de machines, nous ne voulons pas commencer à écrire des scripts sur les alias DNS lors de la mise en marche de la machine. Maintenant, je connais le problème de SPN, puisque nous avons plusieurs services hébergés sur le même site Web (site Web par défaut généralement), nous pouvons seulement créer 1 nom principal de service par serveur/compte. Puisque nous hébergeons plusieurs services par serveur chacun mappé à son propre compte, ce n'est pas une solution.

setspn -a HTTP//WCFServer.domain.com customDomainAccount 

Une autre ride, nous ne définissons pas dans les fichiers de paramètres config, uniquement dans le code, voici le code pour obtenir un repos obligatoire.

protected internal static Binding GetWebHttpBinding() 
     { 
      // Create a new binding with Authentication enabled 
      var binding = new WebHttpBinding(WebHttpSecurityMode.TransportCredentialOnly); 

      // Set defaults 
      SetTimeouts(binding); 
      SetReaderQuotas(binding.ReaderQuotas); 
      binding.MaxReceivedMessageSize = MaxReceivedMessageSize; 
      binding.MaxBufferSize = 65536; 

      // Set the Credential type to Windows to allow single sign-on 
      binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows; 

      // Need Streamed Response since Transport security does not allow streamed requests 
      binding.TransferMode = TransferMode.StreamedResponse; 

      return binding; 
     } 

Répondre

0

j'avais entendu que le nom de la machine est une entrée DNS déjà. Le nom brut/ou la recherche d'une machine est en fait son adresse IP. Donc, quand vous indiquez 'machinename' dans votre URL qui ne fonctionne pas, n'est-ce pas déjà une entrée DNS? Si vous envoyez un ping à 'machinename', quelle est l'adresse IP qui répond au ping? cela devrait être l'IP de la machine.

Pour moi, il semble que vous créez une recherche DNS pour une recherche DNS. Pouvez-vous clarifier un peu?

Je peux confirmer que la magie se produit aussi pour moi, une fois que je reçois une recherche DNS sur le domaine pour l'adresse IP d'un service ou site WCF avec lequel je travaille, donc je comprends d'où vous venez. Je ne sais pas à quoi ressemble votre code client, mais regardez le lien suivant pour faire correspondre. Vous devez créer une référence de réseau avant d'appeler le service RESTful. Si vous faites cela, est-ce que cela résout l'autre problème avec le fait de devoir démonter des kerberos?

0

Ok, beaucoup plus tard, je suis de retour avec la réponse. Pour l'environnement décrit, la seule réponse est d'utiliser l'authentification NTLM. Cela a été confirmé par un appel au support de Microsoft.

0

je recevais aussi des « erreurs de sécurité » similaires avec l'authentification intégrée de Windows et WebHttpBinding essayer d'utiliser WebHttpSecurityMode.TransportCredentialOnly .. mais exigeait SSL donc j'ai pu en tenir à WebHttpSecurityMode.Transport tout en configuration HttpClientCredentialType .Windows.