【问题标题】:Specification of SOAP wsdl for UsernameTokenUsernameToken 的 SOAP wsdl 规范
【发布时间】:2016-01-04 20:35:48
【问题描述】:

我正在编写一个客户端以使用 WSDL 优先方法连接到 SOAP Web 服务。为了实现,我使用的是 Apache CXF 3.1.4 版

测试时出现以下异常:

12:35:15.492 [main] WARN o.a.c.w.p.a.w.Wsdl11AttachmentPolicyProvider - Failed to build the policy 'UsernameToken':sp:UsernameToken must have an inner wsp:Policy element Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: sp:UsernameToken must have an inner wsp:Policy element at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:160) at com.sun.proxy.$Proxy36.getPing(Unknown Source) ... Caused by: java.lang.IllegalArgumentException: sp:UsernameToken must have an inner wsp:Policy element at org.apache.wss4j.policy.builders.UsernameTokenBuilder.build(UsernameTokenBuilder.java:52) at org.apache.wss4j.policy.builders.UsernameTokenBuilder.build(UsernameTokenBuilder.java:34) at org.apache.neethi.AssertionBuilderFactoryImpl.invokeBuilder(AssertionBuilderFactoryImpl.java:138)

WSDL 文件的相关部分如下所示:

<wsp:Policy wsu:Id="UsernameToken"> <wsp:ExactlyOne> <wsp:All> <sp:SupportingTokens> <wsp:Policy> <sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient"/> </wsp:Policy> </sp:SupportingTokens> </wsp:All> </wsp:ExactlyOne> </wsp:Policy>

错误消息表明 CXF 在 UsernameToken 下需要一个策略标记。事实上,在研究过程中,我遇到了comment from CXF bug tracker

Yes... Per spec, the <sp:UsernameToken> element MUST contain an internal wsp:Policy element. It should look like: <sp:UsernameToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient"> <wsp:Policy> <sp:WssUsernameToken11 /> </wsp:Policy> </sp:UsernameToken>

但是,the specification says

/sp:UsernameToken/wsp:Policy This optional element identifies additional requirements for use of the sp:UsernameToken assertion.

注意:可选。

那么它是哪一个?似乎 CXf 需要一个策略,而规范说它是可选的。我还需要查看其他规范吗?

【问题讨论】:

    标签: java web-services soap wsdl cxf


    【解决方案1】:

    似乎这个问题在 SO 上没有引起注意,但在 google 中将某人引到这里,我不妨发布解决方案。

    我在Apache CXF user mailing list上发布了同样的问题并得到了回复:

    这是我刚刚修复的 WSS4J 中的一个错误: https://issues.apache.org/jira/browse/WSS-564

    WS-SecurityPolicy 1.2 + 1.3 需要策略元素,但 1.1 不需要。 在下一个 WSS4J 版本之前,您最好的选择就是拥有一个空策略 元素。

    【讨论】:

    • 您刚刚为我节省了几分钟/几小时/几天的研究时间,谢谢!
    最近更新 更多