繁体   English   中英

使用Metro的Ws-Security标头

[英]Ws-Security headers using Metro

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

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

使用Metro时我会缺少什么吗?

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

我创建了wsdl的本地副本,并在其中定义了策略。 我使用此wsdl创建了Web服务客户端,但是安全头仍然没有用。 wsit-client.xml文件看起来不错。 我什至将所有配置与网络服务的客户端进行了比较,该客户端定义了策略,并且配置相同,但仍然无法正常工作。 到目前为止,我的结论是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 这个线程 (尤其是这个答案 )可能会帮助您设置整个过程。

尝试看一下我在这里写的一个非常相似的问题- 从JAXWS-RI调用.NET Web服务(WSE 3.0,WS-Security) 我仍在尝试通过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/my-webapp/WEB-INF/classes/wsit-client.xml。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM