Java 使用Metro的Ws-Security标头

Java 使用Metro的Ws-Security标头,java,web-services,axis2,ws-security,wsit,Java,Web Services,Axis2,Ws Security,Wsit,我有一个web服务,它实现WS-Security,但不在WSDL中定义策略。我能够使用Axis2作为客户端成功地使用此web服务 我试图使用Metro 2使用相同的web服务,但是wsse:security头不起作用。只有当服务定义了不受我控制的安全策略时,它才起作用。我通过创建一个示例web服务来测试这一点,除非我定义了策略,否则我的metro客户端永远不会发送wsse:security头 我在使用地铁时有什么遗漏吗 编辑------------------------------------

我有一个web服务,它实现WS-Security,但不在WSDL中定义策略。我能够使用Axis2作为客户端成功地使用此web服务

我试图使用Metro 2使用相同的web服务,但是wsse:security头不起作用。只有当服务定义了不受我控制的安全策略时,它才起作用。我通过创建一个示例web服务来测试这一点,除非我定义了策略,否则我的metro客户端永远不会发送wsse:security头

我在使用地铁时有什么遗漏吗

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

我创建了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> 


您需要将
ws:Policy
添加到WSDL的本地副本和
wsit client.xml
。(尤其是)可能会帮助您设置整个过程。

您需要将
ws:Policy
添加到WSDL的本地副本和您的
wsit client.xml
。(尤其是)可能会帮助您设置整个过程。

请尝试查看我在这里针对一个非常类似的情况写的一个问题-。我仍在(!)尝试解决它b/c我现在从服务器端收到了一个错误,但我更新了问题,提供了一些关于我尝试解决这个问题的过程的细节。这里有一个链接,指向我在Metro java.net论坛上发布的一篇对我很有帮助的帖子。不过,我能够为自己生成wsse头

简而言之,我认为在WSDL的本地副本中包含ws:Policy部分(并在创建服务时将该WSDL作为参数发送)。这里有一段代码片段,我在其中创建了我的客户机对象——这里必须简化,因为我使用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/mywebapp/WEB-INF/classes/wsit-client.xml


试着看看我在这里写的一个非常类似的问题-,我仍然(!)b/c我现在从服务器端收到一个错误,但是我更新了这个问题,更新了一些关于我试图让它工作的过程的细节。那里有一个链接,指向我在Metro java.net论坛上发表的一篇对我有帮助的文章。不过,我能够为我生成wsse头

简言之,我认为在WSDL的本地副本中包含ws:Policy部分(并在创建服务时将该WSDL作为参数发送)。下面是一段代码片段,我在其中创建客户机对象——这里必须简化,因为我使用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/mywebapp/WEB-INF/classes/wsit-client.xml


谢谢帕斯卡,我已经看到了这些链接,但运气不好。我已经用更多信息更新了我的问题。你答案中的链接现在已失效。你能提供一些信息在某个地方的档案中找到线索/答案吗?谢谢谢谢帕斯卡,我已经看到了这些链接,但运气不好。我已经用更多信息更新了我的问题。你答案中的链接现在已失效。你能提供一些信息在某个地方的档案中找到线索/答案吗?谢谢我认为你的结论不是真的。
wsit client.xml
是否加载良好?信息:WSP5018:从文件中加载wsit配置:文件:/C:/Documents%20和%20设置/bhushan_bhangale/My%20文档/NetBeansProjects/JavaApplication6/build/classes/META-INF/wsit-client.xml。使用wsdl和wsit-client.xml的内容更新了该问题。我创建了两个web服务,分别是完全相同,只是WS1定义了安全策略,而WS2没有定义。然后,我使用WS1 wsdl创建了一个客户机,并能够发送安全头。现在,在相同的客户机代码中,我只更改web服务的位置