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;
}