【问题标题】:Identity of thread in self hosted WCF service when called from Web Application从 Web 应用程序调用时自托管 WCF 服务中线程的标识
【发布时间】:2010-12-29 15:30:27
【问题描述】:

我有一个自托管 Wcf 服务的 Windows 服务,这个 Wcf 服务有一个带有默认设置的 tcpBinding。 Windows 服务作为 LocalSystem 运行。

Wcf 服务由在 IIS 7.5 集成管道中运行的 Web 应用程序引用(默认设置),该应用程序在其自己的应用程序池中具有自己的标识。

两者都在同一台机器上运行。

一切正常,除了当我在 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"));

【问题讨论】:

    标签: wcf iis wcf-security


    【解决方案1】:

    我们实际上已经在网站上集成了安全设置,然后从网站到我们包装的 WCF 服务的任何调用:

            using (((WindowsIdentity)HttpContext.Current.User.Identity).Impersonate())
            {
    

    这可确保传递登录用户的凭据,而不是 IIS 应用程序池凭据。

    像魔术一样工作!

    【讨论】:

      【解决方案2】:

      清除:

      我在这里检查了错误的属性。因为代码会在 WindowsIdentity.GetCurrent() 身份下执行。

      默认情况下,这与调用者不同(在 Thread.CurrentPrincipal.Identity 中)。如果您想要这种行为,您可以通过以下方式控制:

      host.Authorization.ImpersonateCallerForAllOperations = true;
      

      [OperationBehavior(Impersonation = ImpersonationOption.Required)]
      

      【讨论】:

        【解决方案3】:

        我正在阅读 Michele Bustamante 的Learning WCF。我已将 WCF 用于我已重构的应用程序,我们有兴趣在新应用程序中使用 WCF 以获得它提供的灵活性。 WCF 的缺点之一是使用 .net 属性或 .config 文件来获得正确的设置可能很棘手。我花了几天时间追踪 WCF 设置的问题。我什至创建了自动化测试来检查我的服务是否按预期方式运行。

        在回答您的问题时,Michele 在第七章中非常明确地说 NetTcpBinding 默认是安全的,这意味着调用者必须提供 Windows 凭据以进行身份​​验证。我相信这可以解释为什么线程似乎以 Web 服务的身份运行。这是为了保护您的服务不被未经授权的用户调用。

        我相信以下第 419-420 页的引文将简明扼要地回答您的问题。 “如果您熟悉传统的 .NET 基于角色的安全性,您就会知道每个执行线程都附加了一个安全主体。该安全主体持有调用者的身份,该身份可能与 Windows 帐户或自定义数据库凭据相关联,及其作用。”

        这似乎清楚地表明是的,这是标准行为。

        我相信你可以通过属性和 .config 文件来改变行为。我建议你买一本关于这个主题的好书。我在沙滩上打转了很长时间,试图从网上获取有关 WCF 的点点滴滴的信息。

        【讨论】:

          【解决方案4】:

          需要更多信息,但我猜测它在服务器端或客户端的绑定配置中启用了模拟。添加服务引用时,svcutil.exe 非常积极地在配置中设置所有可能的绑定属性。

          如果您能提供有关服务器和客户端配置的更多信息,将不胜感激。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-08-14
            • 2012-03-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-06-06
            • 2011-10-05
            • 1970-01-01
            相关资源
            最近更新 更多