Contrôle de la SOAP fault dans BC Soap InflowSecurity

classic Classic list List threaded Threaded
8 messages Options
ugo
Reply | Threaded
Open this post in threaded view
|

Contrôle de la SOAP fault dans BC Soap InflowSecurity

ugo
Bonjour,

Dans un BC Soap, nous utilisons le paramètre de service InflowSecurity pour contrôler les informations d'authentification du message entrant. Dans le cas où ces informations sont incorrectes, une exception est levée depuis la classe de passwordCallbackClass et le client reçoit une SOAP fault de la sorte avec l'exception en tant que détail de la Fault :

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <soapenv:Fault>
         <faultcode>soapenv:Server</faultcode>
         <faultstring>unknown</faultstring>
         <detail>
            <Exception>org.apache.axis2.AxisFault
        at org.apache.rampart.handler.WSDoAllReceiver.processMessage(WSDoAllReceiver.java:92)
        at org.apache.rampart.handler.WSDoAllHandler.invoke(WSDoAllHandler.java:72)
        at org.apache.axis2.engine.Phase.invoke(Phase.java:318)
        at org.apache.axis2.engine.AxisEngine.invoke(AxisEngine.java:254)
        at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:160)
        at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:173)
        at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:144)
        at org.ow2.petals.binding.soap.listener.incoming.servlet.SoapServlet.doPost(SoapServlet.java:224)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
        at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
        at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
        at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:726)
        at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
        at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
        at org.mortbay.jetty.Server.handle(Server.java:324)
        at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
        at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:842)
        at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:648)
        at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:205)
        at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
        at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
        at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:450)
Caused by: com.myproject.security.PasswordCallbackHandler$IncorrectPasswordFault
        at com.myproject.security.PasswordCallbackHandler.handle(PasswordCallbackHandler.java:99)
        at org.apache.ws.security.processor.UsernameTokenProcessor.handleUsernameToken(UsernameTokenProcessor.java:168)
        at org.apache.ws.security.processor.UsernameTokenProcessor.handleToken(UsernameTokenProcessor.java:61)
        at org.apache.ws.security.WSSecurityEngine.processSecurityHeader(WSSecurityEngine.java:328)
        at org.apache.ws.security.WSSecurityEngine.processSecurityHeader(WSSecurityEngine.java:245)
        at org.apache.rampart.handler.WSDoAllReceiver.processBasic(WSDoAllReceiver.java:211)
        at org.apache.rampart.handler.WSDoAllReceiver.processMessage(WSDoAllReceiver.java:86)
        ... 23 more</Exception>
         </detail>
      </soapenv:Fault>
   </soapenv:Body>
</soapenv:Envelope>

Comment faire pour contrôler la fault envoyée dans ce cas et ainsi pouvoir valoriser faultcode, faultstring et detail ?

Merci d'avance,
Cordialement,

Ulysse Goarant
Reply | Threaded
Open this post in threaded view
|

Re: Contrôle de la SOAP fault dans BC Soap InflowSecurity

Christophe DENEUX
Administrator
Bonjour Ulysse,

Serait-il possible d'avoir le code de la callback afin de vérifier le bon usage de son API ? De mémoire, le traitement WS-Security est assuré par Axis2, et donc je suppose qu'il retourne ce qu'il faut conformément à la spec WS-Security.

Pendant ce temps, je vais tenter de reproduire ton cas d'usage. Je suppose que tu as fait une authentification 'UsernameToken' ?
Christophe DENEUX
Petals ESB Architect
Linagora
Twitter: @ChrisDENEUX
Reply | Threaded
Open this post in threaded view
|

Re: Contrôle de la SOAP fault dans BC Soap InflowSecurity

Victor Noël
Administrator
In reply to this post by ugo
Une idée serait de faire étendre AxisFault à ta classe IncorrectPasswordFault : ainsi elle serait jeté par le framework rampart (qui gère l'appel à PasswordCallbackHandler) au lieu d'être empaquetée dans une autre AxisFault.

En étendant AxisFault, tu devrais pouvoir changer les valeurs retournées par faultcode, faultstring and co.

Je n'ai pas testé, mais ça devrait pouvoir marcher, dis-nous si tu peux tester.
ugo
Reply | Threaded
Open this post in threaded view
|

Re: Contrôle de la SOAP fault dans BC Soap InflowSecurity

ugo
Bonjour,

Merci pour vos réponses.

J'ai fait étendre ma classe d'exception à AxisFault, mais elle est toujours catchée, au final une WSSecurityException puis une nouvelle AxisFault sont levées. J'ai mis en pièce jointe la SOAP fault reçue.

Aussi, en pièce jointe la classe qui implémente CallbackHandler.

PasswordCallbackHandler.java
soap_fault_axis_exception.txt

Cordialement,
Ulysse

Reply | Threaded
Open this post in threaded view
|

Re: Contrôle de la SOAP fault dans BC Soap InflowSecurity

Victor Noël
Administrator
C'est bizarre, je ne vois pas IncorrectPasswordFault dans la classe Java là… es-tu sûr que c'est la bonne ?

Au passage, quelle est la version du BC SOAP utilisée (comme ça c'est plus facile pour moi pour regarder dans les sources :).

Merci
Reply | Threaded
Open this post in threaded view
|

Re: Contrôle de la SOAP fault dans BC Soap InflowSecurity

Victor Noël
Administrator
In reply to this post by ugo
Ceci dit, il y a de forte chance pour que le problème vienne d'axis/rampart et que la seule solution est d'utiliser la dernière version 1.7 de axis et rampart qui semble corriger ça… (et qu'on ne supporte pas encore, certainement dans la version 5 finale de Petals).
Reply | Threaded
Open this post in threaded view
|

Re: Contrôle de la SOAP fault dans BC Soap InflowSecurity

Victor Noël
Administrator
In reply to this post by ugo
Bonjour,

Au final :
 - On a ouvert une issue JIRA pour ce problème : https://jira.petalslink.com/browse/PETALSBCSOAP-190
 - Il semble compliqué de le résoudre avec un workaround
 - D'après les APIs de Axis/Rampart/WSS4J:
  1) Avec le BC SOAP 4.3.x (Petals 4.3):
    a) Si les mots de passe arrivent en clair sur le service, alors le CallbackHandler doit effectivement jeter une Exception, mais pas une RuntimeException, simplement une IOException ou une UnsupportedCallbackException. Elle sera de toute façon empactée dans une exception de WS-Security donc il ne faut rien y mettre comme information spécifique dedans (pour éviter des problèmes de sécurité).
    b) Si ils arrivent déjà hashé (ce qui est peut-être une bonne idée non ?!) alors le CallbackHandler doit simplement faire un setPassword avec le mot de passe (non hashé) attendu et c'est le BC qui gérera la validation elle-même.
  2) Avec le BC SOAP 4.4.x (Petals 5), il faut toujours utiliser setPassword et ne jamais jeter d'exception.
  3) Dans tout les cas l'erreur ne sera pas joli dans la réponse :)
ugo
Reply | Threaded
Open this post in threaded view
|

Re: Contrôle de la SOAP fault dans BC Soap InflowSecurity

ugo
Merci pour vos explications.

Cordialement,
Ulysse Goarant