2010-05-27 5 views
4

Bref mon scénario est comme ceci:
alt textSite Web ASP.NET -> service WCF -> service WCF, avec usurpation d'identité tout le chemin?

  1. L'utilisateur déclenche une action dans le navigateur Web, ce qui provoque un appel Ajax à un service Web sur le serveur Web (serveur A).
  2. Le serveur Web émet un appel à un service WCF, hébergé dans IIS (serveur B)
  3. Le service WCF émet un appel vers un autre service WCF, hébergé dans IIS (serveur C)

Tous les sites Web sont exposés sur HTTP, pas https.

Maintenant, le serveur C doit savoir qui est l'utilisateur à l'autre extrémité. Je l'ai fait fonctionner jusqu'à présent afin que l'appel de service WCF au serveur B soit effectué sous l'emprunt d'identité, ainsi le serveur B a un objet WindowsIdentity représentant l'utilisateur. Cependant, lorsque je tente d'invoquer l'appel de service du serveur B au serveur C sous l'usurpation d'identité, je reçois le texte suivant retour:

System.ComponentModel.Win32Exception: No credentials are available in the security package 

Server stack trace: 
    at System.IdentityModel.SspiWrapper.AcquireCredentialsHandle(String package, CredentialUse intent, AuthIdentityEx& authdata) 
    at System.ServiceModel.Security.SecurityUtils.GetCredentialsHandle(String package, NetworkCredential credential, Boolean isServer, String[] additionalPackages) 
    at System.ServiceModel.Security.SpnegoTokenProvider.OnOpening() 
    at System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpening() 
    at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 
    at System.ServiceModel.Security.CommunicationObjectSecurityTokenProvider.Open(TimeSpan timeout) 
    at System.ServiceModel.Security.SecurityUtils.OpenTokenProviderIfRequired(SecurityTokenProvider tokenProvider, TimeSpan timeout) 
    at System.ServiceModel.Security.SymmetricSecurityProtocol.OnOpen(TimeSpan timeout) 
    at System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen(TimeSpan timeout) 
    at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 
    at System.ServiceModel.Channels.SecurityChannelFactory`1.ClientSecurityChannel`1.OnOpen(TimeSpan timeout) 
    at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout) 
    at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel channel, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan timeout, CallOnceManager cascade) 
    at System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs) 
    at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 
    at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 

service Tweaking liant éprouve pour moi comme marcher sur la glace si mince que je suis presque marcher sur l'eau, alors laissons de côté ce que j'ai échoué avec si loin, et commençons avec une feuille propre.

Comment dois-je configurer les services pour bien jouer les uns avec les autres (et moi)?

+0

Votre utilisateur est-il le gars de xkcd? :-) –

Répondre

4

Selon Microsoft, vous avez besoin d'utiliser quelque chose appelé « délégation », qui, si je comprends bien, spécifie que les fiducies serveur C serveur B pour authentifier correctement l'utilisateur du serveur A.

Sans délégation, votre service sur le serveur B ne peut accéder aux ressources locales que l'utilisateur personnifié à partir du serveur A.

de la bouche du cheval: http://msdn.microsoft.com/en-us/library/cc949014.aspx

+0

Cela semble très prometteur. Je verrai si je peux l'essayer demain au bureau. –

2

Parce que vous faites plus d'un saut, vous devez utiliser la délégation. Jetez un oeil here pour plus d'informations.