2009-08-31 3 views
3

J'ai un site Web hébergé sur ServerA qui s'exécute en utilisant un pool d'applications en utilisant un accout utilisateur spécial avec des privilèges de domaine pour accéder à notre base de données. Dans le fichier de configuration du site, je précise:Informations d'identification Windows et WCF

<identity impersonate="true" /> 

J'ai alors un service qui est également ServerA et hébergé dans une application console par programme (par exemple pas de fichier de configuration) comme ci-dessous.

Uri uri = new Uri("net.tcp://ServerA:9900/Service/"); 

ServiceHost host = new ServiceHost(typeof(Service1), uri); 

NetTcpBinding binding = new NetTcpBinding(); 
binding.Security.Mode = SecurityMode.Message; 
binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows; 

ServiceEndpoint serviceEndpoint = host.AddServiceEndpoint(typeof(IService1), binding, uri); 
EndpointAddress myEndpointAddress = new EndpointAddress(uri, EndpointIdentity.CreateSpnIdentity("MyspnName")); 
serviceEndpoint.Address = myEndpointAddress; 

host.Open(); 

Quand j'ouvre un navigateur sur ma machine locale et aller sur le site le site tente de se connecter au serveur WCF et renvoie l'erreur « La demande de jeton de sécurité ne pouvait pas être satisfaite, car l'authentification a échoué. »

Le site utilise le code suivant pour se connecter au service:

Uri uri = new Uri("net.tcp://ServerA:9900/Service/"); 

NetTcpBinding binding = new NetTcpBinding(); 
binding.Security.Mode = SecurityMode.Message; 
binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows; 

EndpointIdentity epid = EndpointIdentity.CreateSpnIdentity("MyspnName"); 
EndpointAddress endPoint = new EndpointAddress(uri, epid); 
//EndpointAddress endPoint = new EndpointAddress(uri); 

ChannelFactory<IService1> channel = new ChannelFactory<IService1>(binding, endPoint); 
channel.Credentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Delegation; 
IService1 service = channel.CreateChannel(); 

service.PrintMessage("Print this message!"); 

Pour PrintMessage, la méthode que je vous appelle, j'ai essayé et [OperationBehavior(Impersonation = ImpersonationOption.Required)] .. .Allowed .. mais l'erreur est la même.

Lorsque j'exécute le site localement en utilisant LocalHost il n'y a pas d'erreur et cela fonctionne parfaitement. Et aussi quand je change l'identité impersonate = "false" dans mon web.config il s'exécute mais mes identifiants de Windows ne sont pas passés dans le service de WCF qui est le point entier.

Des idées que je manque? Pls pas de liens généraux, je l'ai probablement déjà lu!

merci beaucoup

+0

Cela serait vraiment utile si vous postez le balisage du fichier de configuration dans le cadre de votre question. La solution peut être aussi simple qu'oublier d'ajouter une référence, etc. –

Répondre

1

Si vous utilisez l'authentification Windows, vous pouvez saisir l'identité de l'appelant dans votre code de service ici:

ServiceSecurityContext.Current.WindowsIdentity 

Ce WindowsIdentity contient des choses comme la propriété « .Nom », la propriété ".Groups" de tous les groupes auxquels appartient l'utilisateur, et plus encore.

Si l'attribut WindowsIdentity doit être NULL, l'authentification Windows n'est pas réellement active.

Hébergez-vous votre service WCF dans IIS? Quelle version - IIS7 est le premier à prendre en charge la liaison net.tcp. Et si vous auto-hébergez votre service dans une application de console, l'authentification Windows fonctionne-t-elle? Dans ce cas, il s'agirait probablement d'un problème de configuration IIS7.

Marc

+0

L'erreur se produit quand j'essaye d'appeler le service, donc je ne peux pas imprimer n'importe quelle information dans mon service. Aussi, vous pouvez voir ci-dessus que j'héberge dans une application de la console déjà –

+0

par défaut, un service WCF n'aura rien (comme une démo ou une page de démarrage) que vous pourriez voir dans votre navigateur. Pouvez-vous vous connecter à votre service en utilisant le WcfTestClient? C'est dans votre répertoire "Common7 \ IDE" de Visual Studio. –

+0

Oui, ils sont dans le même domaine.Cela fonctionne bien avec WcfTestClient et aussi comme je l'ai expliqué ci-dessus cela fonctionne très bien quand je cours le site localement par VS. Il obtient mes informations d'identification Windows sur IIs sur ServerA et ensuite sur le service WCF c'est le problème –

0

Je soupçonne que c'est parce que votre compte de service n'est pas approuvé pour la délégation. Il peut donc emprunter l'identité de l'appelant pour l'accès aux ressources locales, mais pas pour l'appel via TCP. Google "Trusted for delegation" pour plus d'informations.

Questions connexes