【问题标题】:WCF Service as consumer of another WCF ServiceWCF 服务作为另一个 WCF 服务的使用者
【发布时间】:2011-03-08 11:49:05
【问题描述】:

在升级的项目中,我必须在我的 WCF 服务中使用由第 3 方 (no Control) 发布的 WCF 服务 (Service A)。 我一直在 My Web App 项目 (vs2008) 中使用 ServiceA,它运行良好。

我首先在我的 WCF 项目 (ServiceB) 中添加服务引用。假设服务的名称是“XYZ”。 VS 创建了所有必需的文件,但是当我尝试编译时它给出了错误

类型名称“XYZ”不存在于类型“ServiceB.ServiceB”中;

我的“服务 B”有“ServiceB.SVC”

我试图通过删除命名空间“ServiceB”来克服这个问题。来自 Reference.cs 文件及其内容。然后可以编译此代码。

现在我得到了例外

“调用者未通过服务的身份验证。”

内部异常

由于身份验证失败,无法满足对安全令牌的请求

在 System.ServiceModel.Security.SecurityUtils.ThrowIfNegotiationFault(消息消息,EndpointAddress 目标) 在 System.ServiceModel.Security.SspiNegotiationTokenProvider.GetNextOutgoingMessageBody(消息incomingMessage, SspiNegotiationTokenProviderState sspiState)

=>

((System.ServiceModel.FaultException)(ex.InnerException)).Message 由于身份验证失败,无法满足对安全令牌的请求。

ServiceB上的Web.Config文件如下:

 <wsHttpBinding>
        <binding name="WSHttpBinding_IABCService" closeTimeout="00:01:00"
          openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
          bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
          maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
          textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00"
            enabled="false" />
          <security mode="Message">
            <transport clientCredentialType="Windows" proxyCredentialType="None"
              realm="" />
            <message clientCredentialType="Windows" negotiateServiceCredential="true"
              algorithmSuite="Default" establishSecurityContext="true" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://aaaaa/ ServiceA.svc"
        binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IABCService"
        contract="XYZ.IABCService" name="WSHttpBinding_IABCService">
        <identity>
          <servicePrincipalName value="host/[hostname]" />
        </identity>
      </endpoint>
    </client>

======

我让自己相信问题可能出在 WCF 访问 WCF 中。我创建了一个 Web 服务 (.asmx) 并添加了对 ServiceA 的引用。当我通过调用该方法进行调试时,我从 ServiceA 获得结果。希望这是一个我可以使用的解决方案,直到我弄清楚 WCF 和 WCF 问题之间,我添加了对我的 WCF 服务(ServiceB)的 asmx 服务的引用。 当我通过运行 ServiceB --> asmx --> Service A 进行调试时,我再次收到 Authentication failed for user error!!!

我认为这与冒充身份有关...

我读到 ServiceB 的 web.config 优先于 asmx web.config,但我无法找到解决方案。

我无法关闭“Security Mode=None”,因为服务 A 回应说没有令牌通过。

任何帮助将不胜感激: 请记住,我可以从 WebApp 和 asmx 使用 WC 服务 A,但不能直接或间接使用另一个 WCF。

谢谢

三月

【问题讨论】:

    标签: wcf wcf-security


    【解决方案1】:

    这与 WCF 调用 WCF 没有任何关系。试着想象一下,WCF 调用 WCF 会导致编译错误——而您是自 2006 年以来世界上第一个发现这一点的人!

    尝试完全限定“XYZ”类型,拼出完整的命名空间。如果这不起作用,则右键单击每个服务引用并选择“在对象浏览器中查看”。看看这些类型的全称是什么。

    如果这些都对您没有帮助,请发布完整的错误消息和/或异常。

    并且,请不要永远编辑 Reference.cs。下次执行“更新服务参考”时,您的任何编辑都将被销毁。因此,您认为想要对 Reference.cs 进行的任何更改都可以在不更改的情况下以更好的方式完成,或者您真的不想根本不想进行更改(例如您所做的更改)。

    【讨论】:

    • 感谢您建议不要更改 Reference.cs。我在对象浏览器中查看了服务参考,一切看起来都很好。其他人似乎在(互联网搜索)上遇到过类似问题。我正在研究他们的一些问题,看看我是否能找到解决方案。我确实尝试使用完全限定名称,但这没有帮助。我会在可以连接到我的办公系统后立即更新我发现的内容。
    【解决方案2】:

    在我看来,您需要委托而不是冒充。要将当前用户令牌转换为另一个令牌,您可以使用DuplicateToken DuplicateTokenEx(最后一个可以产生TokenPrimary)和SecurityDelegation SecurityImpersonation (SECURITY_IMPERSONATION_LEVEL) 然后是 WindowsIdentity(IntPtr) 构造函数。以LogonUser and delegation 为例。

    另一种方式是协议转换:S4U、S4U2Self(参见http://msdn.microsoft.com/en-us/magazine/cc163500.aspxhttp://msdn.microsoft.com/en-us/library/ff650469.aspxhttp://msdn.microsoft.com/en-us/library/ms998355.aspx)。你可以使用new WindowsIdentity(clientUPN).Impersonate()之类的东西。

    【讨论】:

    【解决方案3】:

    如果您必须进行委托(即充当原始调用者)流程,请参阅 this MSDN Forum thread。不要使用完全信任委托——它需要 AD 的管理员权限,从安全角度来看这不是一件好事。如果您知道在 SETSPN 命令中使用哪些名称,那么约束委派很容易正确设置。还要确保您使用域用户帐户运行服务 B(委托人),网络服务/本地服务或本地用户帐户等机器帐户将无法工作,因为您将无法为这些帐户创建 SPN。

    【讨论】:

    猜你喜欢
    • 2011-01-31
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    相关资源
    最近更新 更多