【问题标题】:Ws-Security headers using Metro使用 Metro 的 Ws-Security 标头
【发布时间】:2011-02-01 22:24:39
【问题描述】:

我有一个实现 WS-Security 但没有在 WSDL 中定义策略的 Web 服务。我能够使用 Axis 2 作为客户端成功使用此 Web 服务。

我正在尝试使用 Metro 2 使用相同的 Web 服务,但 wsse:security 标头不可用。仅当服务定义了不受我控制的安全策略时,它才有效。我通过创建示例 Web 服务对此进行了测试,除非我定义策略,否则我的 Metro 客户端永远不会发送 wsse:security 标头。

我在使用 Metro 时有什么遗漏吗?

编辑------------------------------ --------------------------------------------------------

我创建了 wsdl 的本地副本并在其中定义了策略。我使用这个 wsdl 创建了 Web 服务客户端,但仍然没有安全标头。 wsit-client.xml 文件看起来不错。我什至将所有配置与定义策略的 Web 服务客户端进行了比较,配置相同,但仍然无法正常工作。到目前为止,我的结论是 Metro 客户端需要实际的 Web 服务定义一个策略。

编辑------------------------------ ----------------------------------------------

wsit-client.xml 的内容

<?xml version="1.0" encoding="UTF-8"?> 
<definitions 
xmlns="http://schemas.xmlsoap.org/wsdl/" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" name="mainclientconfig"
>
<import location="NewWebService.xml" namespace="http://test.com/"/>

NewWebService.xml 与 wsit-client.xml 一起定位并包含以下策略信息

<wsp:Policy wsu:Id="NewWebServicePortBindingPolicy">
        <wsp:ExactlyOne>
            <wsp:All>
                <sc:CallbackHandlerConfiguration wspp:visibility="private">
                    <sc:CallbackHandler default="dsfsd" name="usernameHandler"/>
                    <sc:CallbackHandler default="sdfsdfds" name="passwordHandler"/>
                </sc:CallbackHandlerConfiguration>
            </wsp:All>
        </wsp:ExactlyOne>
    </wsp:Policy>

在绑定中这样引用-

<binding name="NewWebServicePortBinding" type="tns:NewWebService">
    <wsp:PolicyReference URI="#NewWebServicePortBindingPolicy"/>

更改后的 wsdl 包含此策略 -

<wsp:Policy xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702" wsu:Id="NewWebServicePortBindingPolicy"> 
    <sp:SignedEncryptedSupportingTokens> 
        <wsp:Policy> 
            <sp:UsernameToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient"> 
                <wsp:Policy> 
                    <sp:WssUsernameToken10 /> 
                </wsp:Policy> 
            </sp:UsernameToken> 
        </wsp:Policy> 
    </sp:SignedEncryptedSupportingTokens> 
    <sp:TransportBinding> 
        <wsp:Policy> 
            <sp:AlgorithmSuite> 
                <wsp:Policy> 
                    <sp:Basic128 /> 
                </wsp:Policy> 
            </sp:AlgorithmSuite> 
            <sp:IncludeTimestamp /> 
            <sp:Layout> 
                <wsp:Policy> 
                    <sp:Lax /> 
                </wsp:Policy> 
            </sp:Layout> 
            <sp:TransportToken> 
                <wsp:Policy> 
                    <sp:HttpsToken RequireClientCertificate="false" /> 
                </wsp:Policy> 
            </sp:TransportToken> 
        </wsp:Policy> 
    </sp:TransportBinding> 
    <sp:Wss10 /> 
    <wsam:Addressing wsp:Optional="true" /> 
</wsp:Policy> 

【问题讨论】:

  • 我不认为你的结论是正确的。 wsit-client.xml 是否加载良好?
  • INFO:WSP5018:从文件加载 WSIT 配置:file:/C:/Documents%20and%20Settings/bhushan_bhangale/My%20Documents/NetBeansProjects/JavaApplication6/build/classes/META-INF/wsit-客户端.xml。
  • 用 wsdl 和 wsit-client.xml 的内容更新了问题
  • 我创建了两个完全相同的 Web 服务,除了 WS1 定义了安全策略而 WS2 没有定义。然后,我使用 WS1 wsdl 创建了一个客户端,并能够发送安全标头。现在在同一个客户端代码中,我只将 Web 服务位置 url 更改为 WS2,它不发送安全标头。

标签: java web-services axis2 ws-security wsit


【解决方案1】:

试着看看我在这里写的一个非常相似的问题 - Calling a .NET web service (WSE 3.0, WS-Security) from JAXWS-RI。我仍然(!)试图通过它b / c我现在从服务器端收到一个错误,但我更新了这个问题,详细介绍了我试图让它工作的过程。那里有一个链接指向我在 Metro java.net 论坛上发布的对我有帮助的帖子。不过,我能够获得为我生成的 wsse 标头。

简而言之,我认为在 WSDL 的本地副本中包含 ws:Policy 部分(并在创建服务时将该 WSDL 作为参数发送)。这是我创建客户端对象的代码 sn-p - 这里必须简单化,因为我正在使用 Spring 工厂将客户端引用注入另一个服务,无论如何,这是 jist:

String wsdlDocumentLocation = "localVersion.wsdl";
QName serviceName = new QName("mynamespace", "myServiceName");
Service service = Service.create(wsdlDocumentLocation, serviceName);
//send the port the fully qualified name of the Metro generated
//client interface
Object port = service.getPort("my.client.package.ClientServiceInterface");

这与您的 wsit-client.xml 一起应该可以工作。您将 wsit-client.xml 文件放在哪里?如果它在类路径中(我的是在 WEB-INF/classes 中),您应该会在控制台中看到一条日志语句,说明它正在被读取。这是我在控制台中看到的消息:

[13:12:06.779] WSP5018:已加载 WSIT 来自文件的配置: 文件:/C:/projects/target/my-webapp/WEB-INF/classes/wsit-client.xml。

【讨论】:

    【解决方案2】:

    您需要将 ws:Policy 添加到 WSDL 的本地副本和您的 wsit-client.xml。 This thread(尤其是this answer)可能会帮助您设置整个事情。

    【讨论】:

    • 感谢 Pascal 我已经看到了这些链接,但没有运气。我已经用更多信息更新了我的问题。
    • 您答案中的链接现已失效。您能否提供一些信息以在某处的存档中找到线程/答案?谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多