我在ServerA上托管了一个网站,该网站使用应用程序池运行,使用具有域权限的特殊用户帐户来访问我们的数据库。在我指定的网站的配置文件中:
<identity impersonate="true" />
然后我有一个服务也在ServerA上,并以编程方式托管在控制台应用程序中(即没有配置文件),如下所示。
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();
当我在本地计算机上打开浏览器并转到网站时,网站会尝试连接到WCF服务器并返回错误“由于身份验证失败,无法满足安全令牌请求。”
网站使用以下代码连接到服务:
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!");
对于PrintMessage,我正在调用的方法,我尝试[OperationBehavior(Impersonation = ImpersonationOption.Required)]
和..。允许..但错误是相同的。
当我使用LocalHost在本地运行网站时,没有错误,它完美无缺。而且当我在我的web.config中更改身份impersonate =“false”时,它会运行,但我的Windows凭据不会被传递到WCF服务,这就是重点。
我缺少什么想法?请不要一般链接,我可能已经读过了!
非常感谢
答案 0 :(得分:1)
如果您使用Windows身份验证,则可以在此处获取服务代码中的呼叫者身份:
ServiceSecurityContext.Current.WindowsIdentity
此WindowsIdentity包含诸如“.Name”属性,用户所属的所有组的“.Groups”属性等内容。
如果WindowsIdentity应该为NULL,那么您实际上并没有进行Windows身份验证。
您是否在IIS中托管WCF服务?哪个版本 - IIS7是第一个支持net.tcp绑定的版本。
如果您在控制台应用程序中自托管服务怎么办?Windows身份验证是否正常工作?在这种情况下,它很可能是一个IIS7配置问题。
马克
答案 1 :(得分:0)
我怀疑这是因为您的服务帐户不受委托信任。 因此,它可以模拟调用者访问本地资源,但不能通过TCP调用。谷歌“信任代表团”了解更多信息。