Bref mon scénario est comme ceci:
Site Web ASP.NET -> service WCF -> service WCF, avec usurpation d'identité tout le chemin?
- 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).
- Le serveur Web émet un appel à un service WCF, hébergé dans IIS (serveur B)
- 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)?
Votre utilisateur est-il le gars de xkcd? :-) –