WCF并传递Windows凭据

时间:2009-08-31 09:51:15

标签: c# .net wcf

我在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服务,这就是重点。

我缺少什么想法?请不要一般链接,我可能已经读过了!

非常感谢

2 个答案:

答案 0 :(得分:1)

如果您使用Windows身份验证,则可以在此处获取服务代码中的呼叫者身份:

 ServiceSecurityContext.Current.WindowsIdentity

此WindowsIdentity包含诸如“.Name”属性,用户所属的所有组的“.Groups”属性等内容。

如果WindowsIdentity应该为NULL,那么您实际上并没有进行Windows身份验证。

您是否在IIS中托管WCF服务?哪个版本 - IIS7是第一个支持net.tcp绑定的版本。

如果您在控制台应用程序中自托管服务怎么办?Windows身份验证是否正常工作?在这种情况下,它很可能是一个IIS7配置问题。

马克

答案 1 :(得分:0)

我怀疑这是因为您的服务帐户不受委托信任。 因此,它可以模拟调用者访问本地资源,但不能通过TCP调用。谷歌“信任代表团”了解更多信息。