【问题标题】:Visual Studio cannot consume Web Service containing UsernameToken policyVisual Studio 无法使用包含 UsernameToken 策略的 Web 服务
【发布时间】:2024-01-22 18:45:01
【问题描述】:

尝试在 Visual Studio 2010 中添加对 Web 服务的引用时出现错误。Web 服务是使用 JAX-WS/Metro/GlassFish 堆栈在 Java 中实现的,并且包含 UsernameToken 策略。以下是 WSDL 的摘录:

<wsp:Policy
        xmlns:wsp="http://www.w3.org/ns/ws-policy"
        xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"
        wsu:Id="UsernameToken">
    <sp:SupportingTokens>
        <wsp:Policy>
            <sp:UsernameToken sp:IncludeToken=".../IncludeToken/AlwaysToRecipient" />
        </wsp:Policy>
    </sp:SupportingTokens>
</wsp:Policy>

当我尝试在 Visual Studio 中添加对此 Web 服务的服务引用时,我收到以下警告:

Custom tool warning:
  The following Policy Assertions were not Imported:
  XPath://wsdl:definitions[@targetNamespace='http://archfirst.org/bfoms/tradingservice.wsdl']/wsdl:binding[@name='TradingWebServicePortBinding']
  Assertions:
    <sp:SupportingTokens xmlns:sp='http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702'>..</sp:SupportingTokens>

Custom tool warning:
  Endpoint 'TradingWebServicePort' at address 'http://localhost:8080/bfoms-javaee/TradingService'
  is not compatible with Silverlight 4. Skipping...

Custom tool warning:
  No endpoints compatible with Silverlight 4 were found. The generated client
  class will not be usable unless endpoint information is provided via the
  constructor.

为什么 Visual Studio 无法导入断言?

附:我能够使用 SoapUI 工具导入和测试 Web 服务。

【问题讨论】:

    标签: wcf jax-ws ws-security java-metro-framework usernametoken


    【解决方案1】:

    默认情况下,WCF 仅支持通过安全传输 = HTTPS 的用户名令牌(或证书提供的消息安全性,但完全由 Silverlight 提供 message security is not supported)。 There is a way 构建自定义绑定以允许用户名令牌通过不安全的传输但 allowInsecureTransport is probably not supported 由 Silverlight 4 (创建自定义绑定时我也没有找到它)。

    WCF 也不支持带有摘要密码的用户名令牌。如果您需要 WCF 安全管道的带有摘要密码 you have to implement additional part 的用户名令牌。同样,这可能是 Silverlight 的有限功能集的问题。

    您可以尝试在托管应用程序中创建代理服务。此服务将由 Silverlight 应用程序调用,它将调用 Java 服务。

    【讨论】:

    • 谢谢拉迪斯拉夫。由于我可以控制服务器,因此我可以将其更改为我想要的任何内容。 Silverlight 客户端支持的最简单的基于 WS-I 的身份验证机制是什么?我对 Java 端的唯一要求是验证调用用户并确定他们的用户名。如果您还可以向我推荐一个链接,该链接解释了如何在 Silverlight 端进行设置,那就太好了。谢谢。
    • 只是想补充一点,我试图避免使用 HTTPS,因为我不想为设置证书而头疼。但是,如果这项工作不如尝试在 Silverlight 中进行身份验证,那么我已经准备好走这条路了。
    • @Naresh:我认为你应该尝试使用 HTTPS。希望它会起作用。
    • 在 Java 服务器端和 Silverlight 客户端进行大量实验后,我得出结论,使用 HTTPS 将非常复杂 - 实现和维护。对于生产应用程序来说,这可能值得付出努力,但我正在做一个概念验证,其中 Web 服务是一个微不足道的部分。所以我现在正在寻找一个足够简单的解决方案来让我继续前进。可能只是我已经工作的basicHttpBinding(通过HTTP),并为用户名和密码添加了几个soap标头。同样,因为它是 POC,所以它不一定是安全的。想法?