我有一个自托管Wcf服务的Windows服务,这个Wcf服务有一个默认设置的tcpBinding。 Windows服务作为LocalSystem运行。
Wcf服务由一个Web应用程序引用(默认设置),该应用程序在IIS 7.5集成管道中运行,该管道在其自己的应用程序池中具有自己的标识。
两者都在同一台机器上运行。
一切正常,但是当我在Wcf服务中检查当前线程的身份时:
Thread.CurrentPrincipal.Identity.Name
它返回Web应用程序的应用程序池的用户..这不是我所期望的。看起来Wcf服务正在进行某种模仿。
这是标准行为吗?我找不到任何关于此的文件。 这是否意味着当我尝试访问Wcf服务中的数据库时,我正在引入标识跳?
修改,服务端的配置:
Type serviceType = typeof(WcfService);
host = new ServiceHost(serviceType);
Binding tcpBinding = new NetTcpBinding( );
Uri tcpBaseAddress = new Uri("net.tcp://localhost:8001/Test");
host.AddServiceEndpoint(typeof (WcfService), tcpBinding, tcpBaseAddress);
host.Open();
在客户端:
NetTcpBinding tcpBinding = new NetTcpBinding(SecurityMode.Transport);
windowsService = new WindowsService.WcfServiceClient(tcpBinding, new EndpointAddress("net.tcp://localhost:8001/Test"));
答案 0 :(得分:3)
我正在阅读Michele Bustamante撰写的学习WCF 。我已经将WCF用于我重构的应用程序,我们有兴趣在新应用程序中使用WCF以提供灵活性。 WCF的缺点之一是使用.net属性或.config文件来获得恰到好处的设置可能会很棘手。我花了几天时间跟踪WCF设置的问题。我甚至创建了自动化测试,它将检查我的服务是否以预期的方式运行。
在回答您的问题时,Michele在第七章中特别指出NetTcpBinding默认是安全的,这意味着调用者必须提供Windows凭据进行身份验证。我相信这可以解释为什么线程似乎作为Web服务的身份运行。这是为了保护您的服务不被未经授权的用户调用。
我相信第419-420页的以下引文将简明扼要地回答您的问题。 “如果您熟悉传统的基于.NET角色的安全性,那么您知道每个执行线程都附加了一个安全主体。该安全主体保存调用者的身份,可以绑定到Windows帐户或自定义数据库凭据,及其角色。“
这似乎明确表示是,这是标准行为。
我相信您可以通过属性和.config文件更改行为。我建议你写一本关于这个主题的好书。我花了很长时间在沙滩上旋转,试图从网上获取有关WCF的信息。
答案 1 :(得分:1)
要澄清:
我在这里检查了错误的财产。因为代码将在WindowsIdentity.GetCurrent()标识下执行。
默认情况下,这与调用者(在Thread.CurrentPrincipal.Identity中)不同。如果您想要这种行为,可以使用以下方法控制:
host.Authorization.ImpersonateCallerForAllOperations = true;
和
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
答案 2 :(得分:1)
我们实际上在网站上集成了安全设置,然后从网站到我们包含的WCF服务的任何调用:
using (((WindowsIdentity)HttpContext.Current.User.Identity).Impersonate())
{
确保传入登录用户的凭据,而不是IIS应用程序池凭据。
像魔术一样工作!
答案 3 :(得分:0)
需要更多信息,但我猜测它是在服务器端或客户端绑定的配置中的某个位置启用了模拟。添加服务引用时,svcutil.exe在配置中设置每个可能的绑定属性都非常积极。
如果您可以在服务器和客户端提供有关配置的更多信息,我们将不胜感激。