首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用UsernameToken profile 1.0使用Axis2和Rampart保护Web

使用UsernameToken profile 1.0使用Axis2和Rampart保护Web
EN

Stack Overflow用户
提问于 2015-09-30 10:42:46
回答 1查看 1.9K关注 0票数 1

这是我在堆栈溢出中的第一个问题。

我不是一个专业的java程序员,但我有以前的经验,语言和不同的IDE。

我有一个场景,客户需要从给定的WSDl中创建必须使用UsernameToken Profile 1.0 OASIS标准200401进行身份验证的服务。它将在生产服务器上受到ssl的保护。

我一直在做一些研究,并试图实现不同的案例,我到达了一个点,任何事情都不适合我。

我在用:

  • Eclipse作为基本IDE
  • Axis2 V1.6.3
  • Rampart V1.6.2
  • 拉哈斯V1.6.2

为了了解当前的情况,这里我向您展示了eclipse在从wsdl作为基本IDE生成java服务结构时为我创建的结构。

https://dl.dropboxusercontent.com/u/71031985/schema.png

应用的配置:

在WebContent/WEB/conf/axis2.xml中,我启用了rampart模块和passwordCallbackClass能够处理soap头中提供的用户名和密码。

代码语言:javascript
复制
<module ref="rampart" />

<parameter name="InflowSecurity">
    <action>
        <items>UsernameToken</items>
        <passwordCallbackClass>
            serviceManager.ServiceAuthUserNameToken
        </passwordCallbackClass>
        <passwordType>PasswordText</passwordType>
    </action>
</parameter>

...

在位于/WebContent/WEB-INF/services/ProveedorCentroTFWS/META-INF/services.xml中的文件中,我放置了壁垒策略,以便能够完成usernametoken要求:

代码语言:javascript
复制
    <wsp:Policy wsu:Id="UTOverTransport" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
<wsp:ExactlyOne>
  <wsp:All>
    <sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
      <wsp:Policy>
        <sp:TransportToken>
          <wsp:Policy>
            <sp:HttpsToken RequireClientCertificate="false"/>
          </wsp:Policy>
        </sp:TransportToken>
        <sp:AlgorithmSuite>
          <wsp:Policy>
            <sp:Basic128/>
          </wsp:Policy>
        </sp:AlgorithmSuite>
        <sp:Layout>
          <wsp:Policy>
            <sp:Lax/>
          </wsp:Policy>
        </sp:Layout>
        <sp:IncludeTimestamp/>
      </wsp:Policy>
    </sp:TransportBinding>
    <sp:SignedSupportingTokens xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
        <wsp:Policy>
            <sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient" />
      </wsp:Policy>
    </sp:SignedSupportingTokens>

    <ramp:RampartConfig xmlns:ramp="http://ws.apache.org/rampart/policy"> 
        <ramp:passwordCallbackClass>serviceManager.ServiceAuthUserNameToken</ramp:passwordCallbackClass>
    </ramp:RampartConfig>

  </wsp:All>
</wsp:ExactlyOne>

当从客户端提供的测试客户端执行调用(不能修改)时,它发送以下soap消息:

代码语言:javascript
复制
    <?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
    <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" soapenv:mustUnderstand="1">
        <wsse:UsernameToken wsu:Id="UsernameToken-3">
            <wsse:Username>username</wsse:Username>
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">definedpwd</wsse:Password>
        </wsse:UsernameToken>
    </wsse:Security>
    <wsa:To>http://localhost:8080/ProveedorCentroTFWS</wsa:To>
    <wsa:MessageID>urn:uuid:f2fb54d9-8957-49a2-88a7-de6d209e6d35</wsa:MessageID>
    <wsa:Action>getActionList</wsa:Action>
</soapenv:Header>
<soapenv:Body>
    <ns3:getActionListxmlns:ns3="http://impl.ws.application.proveedorcentro.meyss.spee.es" />
</soapenv:Body>

一旦发送soap消息,返回的错误如下:

代码语言:javascript
复制
    java.lang.RuntimeException: Malformed uri: UsernameTokenPolicy

它下面的堆栈跟踪是:

代码语言:javascript
复制
    org.apache.neethi.PolicyReference.getRemoteReferencedPolicy(PolicyReference.java:155)
org.apache.neethi.PolicyReference.normalize(PolicyReference.java:110)
org.apache.axis2.util.PolicyUtil.getMergedPolicy(PolicyUtil.java:267)
org.apache.axis2.description.AxisBindingMessage.calculateEffectivePolicy(AxisBindingMessage.java:294)
org.apache.axis2.description.AxisBindingMessage.getEffectivePolicy(AxisBindingMessage.java:225)
org.apache.axis2.context.MessageContext.getEffectivePolicy(MessageContext.java:1617)
org.apache.rampart.RampartMessageData.&lt;init&gt;(RampartMessageData.java:233)
org.apache.rampart.MessageBuilder.build(MessageBuilder.java:61)
org.apache.rampart.handler.RampartSender.invoke(RampartSender.java:65)
org.apache.axis2.engine.Phase.invokeHandler(Phase.java:340)
org.apache.axis2.engine.Phase.invoke(Phase.java:313)
org.apache.axis2.engine.AxisEngine.invoke(AxisEngine.java:262)
org.apache.axis2.engine.AxisEngine.sendFault(AxisEngine.java:516)
org.apache.axis2.transport.http.AxisServlet.handleFault(AxisServlet.java:433)
org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:216)
javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

我检查了所有的东西和每一种方法,试图让它接受soap消息,但我无法使它工作。

谢谢你的支持和关注

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-07 09:48:46

这个问题的解决方案是,所提供的WSDL错过了一些部件,以便能够在UsernameToken Profile1.0OASIS标准200401下进行自动处理。

在IBM 页面中找到了解决这一问题的方法。

在WSDL文档中,绑定标记下有一个策略引用:

代码语言:javascript
复制
<wsp:PolicyReference URI="#UsernameTokenPolicy" wsdl:required="true"/>

阅读在线文档时,我发现它没有指向任何地方,并且有必要在同一个WSLD文件中添加一个策略条目,比如下一个文件中有标识符名(#UsernameTokenPolicy)或我们要应用的策略的所需名称:

代码语言:javascript
复制
<wsp:Policy wsu:Id="UsernameTokenPolicy" xmlns:wsp="http://www.w3.org/ns/ws-policy"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<sp:SupportingTokens
    xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
    <wsp:Policy>
        <sp:UsernameToken
            sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
            <wsp:Policy>
                <sp:WssUsernameToken11 />
            </wsp:Policy>
        </sp:UsernameToken>
    </wsp:Policy>
</sp:SupportingTokens>
<wsss:ValidatorConfiguration wspp:visibility="private"
      xmlns:wsss="http://schemas.sun.com/2006/03/wss/server"
      xmlns:wspp="http://java.sun.com/xml/ns/wsit/policy">
    <wsss:Validator name="usernameValidator" classname="[packageName].[callBackValidatorName]"/>
    </wsss:ValidatorConfiguration>
</wsp:Policy>

完成此操作后,您需要创建一个具有响应性的回调Validator,以处理SOAP请求的头凭据,如下所示:

代码语言:javascript
复制
package [packageName];


import com.sun.xml.wss.impl.callback.PasswordValidationCallback;
import java.io.IOException;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.UnsupportedCallbackException;

public class [callBackValidatorName] implements PasswordValidationCallback.PasswordValidator{

@Override
public boolean validate(PasswordValidationCallback.Request request) throws PasswordValidationCallback.PasswordValidationException {

    PasswordValidationCallback.PlainTextPasswordRequest ptreq;

    ptreq = (PasswordValidationCallback.PlainTextPasswordRequest) request;

    return "[HARCODED_USERNAME]".equals(ptreq.getUsername()) &&
        "[HARCODED_PWD]".equals(ptreq.getPassword());
}
}

完成所有这些之后,您必须能够在服务器端Java服务下修改与JavaProfile1.0OASIS标准200401匹配的SOAP消息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32864060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档