在Axis2 / Rampart中,如何在PasswordCallBackHandler中获取SAML断言

时间:2016-08-25 08:45:59

标签: axis2 rampart

我使用STS保护基于SOAP的Web服务。令牌是SAML 1.0令牌。 SAML令牌作为安全头添加在SOAP Header中。我需要SAMLAssertions,因为我需要从SAMLAssertion获取nameIdentifier。

我可以在PasswordCallBackHandler类中掌握SAMLAssertion吗?有没有其他方法可以做到。

1 个答案:

答案 0 :(得分:0)

最后,我能够找到一种方法来做我想做的事。我将逐点列出解决方案:

  • 通过密码CallBackHandler无法实现,因为轴不允许访问MessageContext。

  • 解决方案是创建一个自定义处理程序类,它扩展了org.apache.axis2.handlers.AbstractHandler。因为在我的情况下它是一个SAML2安全令牌,我希望我的处理程序在'InFlow'阶段顺序中被称为'后安全'阶段。这可确保安全标头已通过安全阶段。处理程序类有一个invoke方法,它有一个MessageContext作为参数。 MessageContext使您可以访问整个SOAPEnvelope及其内容。以下是您可以构建的框架代码:

      public class LIMSConHandler extends AbstractHandler  {
          private Log LOG = LogFactory.getLog(LIMSConHandler.class);
    
          public InvocationResponse invoke(MessageContext ctx) throws  AxisFault {
    
          //following code gives you access to the soapEnvelope
          SOAPEnvelope msgEnvelope = ctx.getEnvelope();
          SOAPHeader msgHeader = msgEnvelope.getHeader();
          //add your logic to extract the security header and SAML assertion
    
          return InvocationResponse.CONTINUE;
     }
    

将此处理程序绑定到axis2.xml中的“Post-Security”自定义阶段

    <phaseOrder type="InFlow">
     .........
    <phase name="Security"/>
    <phase name="PostSecurity">
    <handler name="LIMSConHandler"    class="labware.web.ws.control.LIMSConHandler"/>

我欢迎对此提出意见。