【问题标题】:Java Client Consuming .NET WCF over SSL (WS-Policy not supported)Java 客户端通过 SSL 使用 .NET WCF(不支持 WS-Policy)
【发布时间】:2011-12-15 15:57:16
【问题描述】:

我在 Windows Server 2008 上的 IIS 中托管了一个 .NET 4.0 WCF 服务,该服务在 HTTP 上运行良好。 WCF 服务正在被第三方使用,该第三方正在使用 Appian Process Modeler 来配置 WCF 客户端(并不是说它是相关的,但我想我会提到它)。

编辑:所以他们使用 Appian Process Modeler 的事实可能实际上是相关的。它是一个基于 Java 的客户端,因此这意味着我们正在尝试让 Java 客户端使用基于 SSL 的 WS-Policy 来使用 .NET WCF 服务。

编辑 #2:由于我现在知道 Java 正在使用 .NET 服务,这是我可以做的修复,以允许 Java 通过 SSL 使用我的服务,还是修复我的客户端是否可以允许他们的 Java 代码使用 WS-Policy 使用 .NET 服务?

从测试转移到我们的生产环境后,当我们的客户端更新其服务引用以指向新的生产 URL 时,他们收到以下错误:

端点 BasicHttpBinding_IInterface 包含对尚不支持的 WS-Policy 主题的引用。该端点不可选择。 (APNX-2-4041-003)

在比较两个 WSDL 文档(非 SSL/测试、SSL/生产)时,我发现了以下两个差异,它们都与 WS-Policy 相关(这是 WSDL 文档中唯一的两个差异,URL 除外) :

<wsp:Policy wsu:Id="BasicHttpBinding_IInterface_policy">
    <wsp:ExactlyOne>
      <wsp:All>
        <sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
          <wsp:Policy>
            <sp:TransportToken>
              <wsp:Policy>
                <sp:HttpsToken RequireClientCertificate="false"/>
              </wsp:Policy>
            </sp:TransportToken>
            <sp:AlgorithmSuite>
              <wsp:Policy>
                <sp:Basic256/>
              </wsp:Policy>
            </sp:AlgorithmSuite>
            <sp:Layout>
              <wsp:Policy>
                <sp:Strict/>
              </wsp:Policy>
            </sp:Layout>
          </wsp:Policy>
        </sp:TransportBinding>
      </wsp:All>
    </wsp:ExactlyOne>
  </wsp:Policy>

<wsp:PolicyReference URI="#BasicHttpBinding_IInterface_policy"/>

我尝试在生产环境中创建一个静态 WSDL 文档并删除这两个部分,但如果这样做,我将无法生成与 WCF 服务的安全连接。

所以我的问题是,如何配置 WCF 在没有 WS-Policy 要求的情况下通过 SSL 响应?

这是我们在服务器上使用的配置:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="basicHttps">
                <security mode="Transport">
                    <transport clientCredentialType="None" />
                    <message />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <client />
    <services>
      <service name="Namespace.API.IInterface_Implementation">
        <endpoint address=""
                  binding="basicHttpBinding"
                  bindingConfiguration="basicHttps"
                  contract="Namespace.API.Interfaces.IInterface"/>
        <endpoint address="mex"
                  binding="mexHttpsBinding"
                  contract="IMetadataExchange"/>

      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" />
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

【问题讨论】:

    标签: java c# wcf ssl appian


    【解决方案1】:

    根据微软的说法,这似乎是不可能的。

    请参阅 herehere

    身份验证模式和相应的前缀和命名空间在MSDN 中讨论。这可能会给你一些额外的想法。

    【讨论】:

    • 感谢您的回复和链接。我认为我的问题更像是“如何让 Java 客户端通过 SSL 使用我的 .NET WCF 服务”,而不是“如何关闭 WS-Policy”。我赞成您的回答,因为这些链接确实提供了对我最初问题的一些见解。
    • @Scott:这是一篇关于这个主题的非常好的文章:honga.super6.cz/2011/07/…
    • 谢谢,这很有帮助。我认为这是需要在 Java 端发生的事情才能让它工作。这篇文章确实有帮助。我将把这个问题留一点,看看是否有其他人有具体的建议。再次感谢。
    • 上面的 URL 不再有效。它已移至:hoonzis.blogspot.com/2011/07/aspnet-forms-authentication-and-java.html 另一方面 - 我不得不说,您的问题似乎很特别,您将无法在那里找到解决方案。
    • 你可以实现这个..并不难..你只需要知道你必须发送什么:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 2020-08-11
    相关资源
    最近更新 更多