UsernameToken 的 SOAP wsdl 规范
Specification of SOAP wsdl for UsernameToken
我正在编写客户端以使用 WSDL 优先方法连接到 SOAP 网络服务。对于实现,我使用的是 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>
/sp:UsernameToken/wsp:Policy
This optional element identifies additional requirements for use of the
sp:UsernameToken assertion.
注意:可选。
那么是哪一个呢?似乎 CXf 需要一个策略,而规范说它是可选的。我需要查看其他规范吗?
似乎这个问题在 SO 上并没有被注意到,但是在 google 带领某人来到这里,我也可以 post 解决方案。
我 post 在 Apache CXF user mailing list 上提出了同样的问题并得到了回复:
这是 WSS4J 中的一个错误,我刚刚修复了它:
https://issues.apache.org/jira/browse/WSS-564
WS-SecurityPolicy 1.2 + 1.3 需要策略元素,但 1.1 不需要。
在下一个 WSS4J 版本发布之前,最好的办法就是制定一个空政策
元素.
我正在编写客户端以使用 WSDL 优先方法连接到 SOAP 网络服务。对于实现,我使用的是 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>
/sp:UsernameToken/wsp:Policy
This optional element identifies additional requirements for use of the
sp:UsernameToken assertion.
注意:可选。
那么是哪一个呢?似乎 CXf 需要一个策略,而规范说它是可选的。我需要查看其他规范吗?
似乎这个问题在 SO 上并没有被注意到,但是在 google 带领某人来到这里,我也可以 post 解决方案。
我 post 在 Apache CXF user mailing list 上提出了同样的问题并得到了回复:
这是 WSS4J 中的一个错误,我刚刚修复了它: https://issues.apache.org/jira/browse/WSS-564
WS-SecurityPolicy 1.2 + 1.3 需要策略元素,但 1.1 不需要。 在下一个 WSS4J 版本发布之前,最好的办法就是制定一个空政策 元素.