【问题标题】:What is the correct configuration for a CXF SOAP Service with UsernameTokenSignature?带有 UsernameTokenSignature 的 CXF SOAP 服务的正确配置是什么?
【发布时间】:2015-07-29 07:13:29
【问题描述】:

我正在尝试使用 UsernameTokenSignature 设置 CXF 服务和客户端。起点是现有的、代码优先的服务。不幸的是,我发现的所有示例都使用 WS-Policy,据我所知,CXF 在代码优先场景中不支持它。

我设法创建了一个客户端,它使用此配置发送我期望的消息:

客户:

<jaxws:client id="clientWithUsernameTokenSignature" serviceClass="mypackage.MyServiceInterface" address="http://localhost:8081/ws-security-secured-soap-service/services/Service_v1">
    <jaxws:outInterceptors>
        <ref bean="WSS4JOutInterceptor_UsernameTokenSignature" />
    </jaxws:outInterceptors>
</jaxws:client>

WSS4JOutInterceptor

 <bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor" id="WSS4JOutInterceptor_UsernameTokenSignature">
    <constructor-arg>
        <map>
            <entry key="action" value="UsernameTokenSignature" />
            <entry key="user" value="Admin" />
            <entry key="passwordCallbackClass" value="mypackage.ClientCallbackHandler" />
        </map>
    </constructor-arg>
</bean>

但是,我未能设置服务以正确处理来自此客户端的消息。我试过了:

服务:

<jaxws:endpoint id="soapServ_v3" implementor="#myServiceFacade" address="/MyService_v1">
        <jaxws:inInterceptors>
            <ref bean="WSS4JInInterceptor_UsernameTokenSignature" />
        </jaxws:inInterceptors>
</jaxws:endpoint>

WSS4JInInterceptor

<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor" id="WSS4JInInterceptor_UsernameTokenSignature">
    <constructor-arg>
        <map>
            <entry key="action" value="UsernameTokenSignature" />
            <entry key="passwordCallbackClass" value="mypackage.ServerCallbackHandler" />
        </map>
    </constructor-arg>
</bean>

这样做,服务器不接受来自客户端的消息,并以安全错误进行响应。 调试发现第一个失败的地方是org.apache.wss4j.dom.validate.UsernameTokenValidator的verifyUnknownPassword。 这里allowUsernameTokenDerivedKeys 设置为false。我想我可以设置一些配置来将其设置为 true。

服务器上允许用户名令牌派生密钥的正确配置是什么?

即使我使用调试器将值更改为 true,服务调用仍然失败。在这种情况下,拦截器会在 checkActions 处引发异常:“处理标头时发现错误”。

所以我想我还需要配置其他东西。 有人知道如何正确设置吗?

【问题讨论】:

  • 您使用哪个版本的 cxf?
  • 能否请您发布您得到的确切错误?

标签: java soap cxf ws-security wss4j


【解决方案1】:

好吧,我终于想通了。布尔属性“allowUsernameTokenNoPassword”需要设置为“true”,以便服务器接受没有密码的 UT。然后要通过安全标头检查,还需要添加“UsernameTokenNoPassword”作为操作。

工作配置如下所示:

WSS4JInInterceptor:

<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor" id="WSS4JInInterceptor_UsernameTokenSignature">
    <constructor-arg>
        <map>
            <entry key="action" value="UsernameTokenSignature UsernameTokenNoPassword" />
            <entry key="allowUsernameTokenNoPassword" value="true" />
            <entry key="passwordCallbackClass" value="mypackage.ServerCallbackHandler" />
        </map>
    </constructor-arg>
</bean>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2014-07-16
    • 2020-06-28
    • 1970-01-01
    • 2016-12-18
    相关资源
    最近更新 更多