WCF et l'Authentification Kerberos
J'ai suivi de nombreux articles msdn et la codeplex des conseils, mais ne peut pas obtenir de la WCF pour travailler avec l'authentification Kerberos et de délégation et de apprécierais un peu d'aide.
Installation
J'ai le service WCF dans un site web IIS sur une machine distante
- IIS 6.0 sur Windows 2003 R2 sp2
- Le nom principal de service pour la machine a été ajouté (http/monserveur && http/myserver:8080)
- Une ANNONCE compte a été créé pour le pool d'applications IIS
- Le compte d'ANNONCE a la mise en, permettre de délégation (Kerberos), affectez la valeur true
Je suis en utilisant Brian Stand de débogage du site sur 8080 et le site passe à toutes les exigences de la délégation Kerberos. Le débogage site IIS authentification anonyme off, et l'authentification Intégrée de Windows.
J'ai en miroir de ces paramètres sur le site hébergeant le service WCF.
Service Web - Web Config (D'Origine)
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WsHttpBindingConfig">
<security>
<message negotiateServiceCredential="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="ServiceBehavior" name="Service">
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="WsHttpBindingConfig"
contract="IService">
<identity>
<servicePrincipalName value="http/myserver" />
<dns value="" />
</identity>
</endpoint>
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceAuthorization
impersonateCallerForAllOperations="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Service Web - Web Méthode
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public string GetCurrentUserName()
{
string name = WindowsIdentity.GetCurrent().Name;
return name;
}
Client App - App Config
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IService"
... />
...
<security mode="Message">
<transport clientCredentialType="Windows"
proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows"
negotiateServiceCredential="true"
algorithmSuite="Default"
establishSecurityContext="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://myserver/Service.svc"
binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_IService"
contract="KerberosService.IService"
name="WSHttpBinding_IService">
<identity>
<servicePrincipalName value="http/myserver" />
</identity>
</endpoint>
</client>
</system.serviceModel>
Erreur D'Application
L'erreur suivante se produit lors de mon test de l'application, une application WinForms, essaie d'appeler la méthode web:
"La requête HTTP est autorisée avec
le schéma d'authentification client
"Anonyme". L'en-tête d'authentification
reçu du serveur a été
"Negotiate,NTLM"."
Journal Des Événements
L'erreur suivante dans le journal des événements:
Exception:
Système.ServiceModel.ServiceActivationException:
Le " service/Service.svc' ne peut pas être
activé en raison d'une exception lors de l'
la compilation. Le message d'exception
est: les paramètres de Sécurité de ce service
require 'Anonyme' Authentification, mais
il n'est pas activé pour l'IIS
application qui héberge ce service.
Dont je ne comprends pas. Le point entier de ce service est de ne pas permettre l'authentification anonyme, chaque utilisateur/demande doit être authentifié à l'aide de tickets Kerberos, puis de les transférer à d'autres machines.
Comment dois-je configurer ce service WCF pour l'authentification Kerberos et la délégation?
Révision 1
Après la lecture de cette SORTE de question j'ai enlevé le point de terminaison de métadonnées. Cela n'a pas résolu le problème.
Révision 2
Après plusieurs recherches, j'ai trouvé quelques posts suggérant de changer wsHttpBinding à basicHttpBinding. La modification de la partie du web.config a été inclus ci-dessous, et le point de terminaison de service a été mis à jour pour faire référence à cette liaison.
Service Web - Web Config (Révisée)
<basicHttpBinding>
<binding name="basicBindingConfig">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows"
proxyCredentialType="Windows"
realm="" />
</security>
</binding>
</basicHttpBinding>
Client App - App Config (Révisée)
<!-- ... -->
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows"
proxyCredentialType="Windows"
realm="" />
<message clientCredentialType="UserName"
algorithmSuite="Default" />
</security>
<!-- ... -->
Erreur (Révisée)
L'erreur actuelle ressemble, il contient un en-tête d'authentification Kerberos.
La requête HTTP est autorisée avec
le schéma d'authentification client
'Négocier'. L'en-tête d'authentification
reçu du serveur a été
'Négocier SOMEHUGESCARYKEYHERE
J'ai ajouté la version révisée de l'app config basée sur marc_s commentaires.
OriginalL'auteur blu | 2009-08-18
Vous devez vous connecter pour publier un commentaire.
Pour moi la configuration actuelle fonctionne:
Sur le Serveur:
Définir l'attribut suivant sur toutes les méthodes de la WCF:
Sur le Client:
HTH, Sven
J'ai l'Authentification Windows et l'Accès Anonyme est activé. Mais vous aurez besoin d'Anonymes seulement, lors de l'ajout de la mex (IMetadataExchange) d'Extrémité pour votre service.
OriginalL'auteur Sven Sönnichsen
Quelque chose que je remarque: le client et le serveur config ne semblent pas d'accord sur le mode de sécurité.
Dans la section originale, vous avez
<security>.....
dans le web.config (omis de la mode="message"), et<security mode="Message">
sur le côté client.Après votre montage, il semble que le côté client est inchangé, mais le serveur (web.config) contient maintenant
<security mode="TransportCredentialOnly">
.La véritable question est: pouvez-vous garantir qu'il y a seulement jamais va être l'un réseau de la jambe entre le client et le serveur s'appelle? I. e. est-ce derrière un pare-feu d'entreprise? Dans ce cas, je vous recommande netTcp liaison avec
<security mode="Transport">
sur les deux extrémités.Si ce n'est pas le cas, alors vous êtes ok avec soit wsHttpBinding (qui prend en charge plus de sécurité et de fiabilité de fonctionnalités, mais est plus lent et le plus "lourd") ou basicHttpBinding. Dans ce cas, vous devez utiliser
<security mode="Message">
sur les deux extrémités, et d'authentifier le service avec un certificat (de sorte que le client et les services ont en commun un "secret" à utiliser pour le chiffrement).Je voudrais essayer de laisser l'usurpation de l'identité de pièces pour le début et juste obtenir la base de la communication et de l'authentification mutuelle entre le client et les services en place et l'exécution de la première fois qui est en place, vous pouvez commencer à ajouter l'usurpation de l'identité de bits, et vous pouvez toujours vous rabattre sur une configuration connue qui fonctionne.
David Sackstein a un une grande série de billets de blog expliquant les cinq scénarios de sécurité que le gourou de l'industrie Juval Lowy a identifié (dans son La programmation de la WCF livre - la WCF de la Bible) est la plus fréquente et la plus utile, afin de limiter le nombre de combinaisons possibles de paramètres que vous pourriez souhaitez modifier. L'un d'eux est un "Internet" scénario qui aurait probablement s'appliquer ici, si votre service est face vers l'extérieur.
Marc
"authentifier le service avec un certificat", c'est quelque chose que quelqu'un ici est d'essayer d'éviter. Nous espérions à utiliser directement les tickets Kerberos pour authentifier les utilisateurs et de déléguer tout le chemin à travers le back-end de machines comme les SP et SQL.
OriginalL'auteur marc_s
Vous devez spécifier un paramètre behaviorconfiguration dans votre config du client. SVCUtil ne pas générer automatiquement. Cela a résolu mon problème et je suis maintenant avec succès à l'aide de Kerberos. C'était une mission!
OriginalL'auteur Jonathan
Vous devriez essayer de votre configuration initiale et assurez-vous de définir l'IIS être anonyme et l'authentification windows en même temps.La raison en est que lorsque vous utilisez wsHttpBinding de sécurité par défaut est le message de sécurité et il n'y a pas de transport de sécurité définie, sauf si vous voulez faire du https. DONC Clr états qu'il a besoin d'authentification anonyme est activée sur le serveur IIS.
OriginalL'auteur user507040