2010-05-27 96 views
4

总之我的情况是,像这样:
alt textASP.NET网站 - > WCF服务 - > WCF服务,一路模仿?

  1. 用户触发了Web浏览器的行为,这会导致Web服务器调用Ajax Web服务(服务器A)。
  2. Web服务器发出到WCF服务的调用,托管在IIS(服务器B
  3. WCF服务发布到另一个WCF服务的调用,托管在IIS(服务器C

所有网站都通过http暴露,而不是https。

现在,服务器C需要知道用户是谁在另一端。到目前为止,我的工作是这样的,WCF服务调用服务器B是在模拟下执行的,所以服务器B有一个代表用户的WindowsIdentity对象。然而,当我尝试从服务器B上的服务呼叫调用到服务器C下的模拟,我得到以下回:

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) 

扭捏服务绑定感觉我像在冰上行走这么瘦,我几乎走在水,所以让我们从我迄今为止失败的事情中无视,并从一张干净的纸张开始。

我应该如何配置服务与对方(和我)很好地玩?

+0

用户是xkcd的家伙吗? :-) – 2010-05-31 14:10:42

回答

4

据微软称,你需要使用一些所谓的“授权”,而如果我理解正确的,是指定服务器C信任服务器B正确地认证从服务器A的用户

没有代表团服务在服务器B只能访问本地资源为模拟用户从服务器A.

从马的嘴:http://msdn.microsoft.com/en-us/library/cc949014.aspx

+0

这看起来很有希望。明天我会在办公室看看我能否试用它。 – 2010-05-27 15:47:29

2

因为你正在不止一个跳,你需要使用委派。看看here了解更多信息。