2012-05-14 87 views
3

我寫的用地鐵/ WSIT庫一個Java Web服務客戶端,web服務,我需要打的WCF服務請求後,不理解SOAP安全頭。 (我幾乎無法控制服務端和WSDL)。WSIT自定義安全頭

Web服務使用安全令牌服務(WS-Trust/WSDL)與傳輸級安全(SSL)和聯合安全模型進行了安全保護。的WS-Security)。我使用Windows Identity Foundation輕鬆地在.NET中實現了客戶端,首先發布安全令牌,然後使用(CreateChannelWithIssuedToken)方法向其他Web服務發出請求。

我有困難mimicing在Java的這種行爲,但是,使用地鐵/ WSIT。我的理解是,由於WSDL中缺少WS-Policy信息,WSIT將不會啓用與服務通信的安全處理。我通過在發送SOAP請求頭之前操作SOAP來創建請求,並且現在我正在接收與在.NET客戶端上收到的消息相同的消息。

現在,我的問題是,我收到以下錯誤:

Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: MustUnderstand headers:[{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}Security] are not understood 
at com.sun.xml.ws.protocol.soap.MUTube.createMUSOAPFaultException(MUTube.java:148) 
at com.sun.xml.ws.protocol.soap.ClientMUTube.processResponse(ClientMUTube.java:96) 
at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:972) 
at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:910) 
at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:873) 
at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:775) 
at com.sun.xml.ws.client.Stub.process(Stub.java:429) 
at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:168) 
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:119) 
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:102) 
at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:151) 

因爲SOAP響應在標頭中的安全部分:

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
<s:Header> 
    <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
     <u:Timestamp u:Id="_0"> 
      <u:Created>2012-05-14T21:20:08.782Z</u:Created> 
      <u:Expires>2012-05-14T21:25:08.782Z</u:Expires> 
     </u:Timestamp> 
    </o:Security> 
</s:Header> 
<s:Body> 
    ... 

既然我不能修改WSDL有沒有一種方法可以手動強制Metro/WSIT爲響應啓用安全處理,以避免引發此異常?我不打算使用安全標頭,並且響應的有效負載如預期的那樣。我明白我看到的是正確的行爲,如果客戶端不理解帶有mustunderstand =「1」的頭部,但我正在尋找一種方法來抑制此異常。

我看過其他問題,如this one,這似乎是接近我想要什麼,但我還沒有找到答案。任何建議/解決方案/等。非常感謝!

回答

1

我發現一種解決方法(合適暫且)涉及插入到地鐵處理流水線定製的「管」。

我創建的延伸com.sun.xml.ws.api.pipe.helper.AbstractFilterTubeImpl,並覆蓋processResponse(Packet packet),搜索名爲「安全」標題,並呼籲packet.getMessage().getHeaders().understood(int)在安全頭,我發現的頭列表中的索引自定義處理管類。這樣可以防止管理人員試圖理解安全標題(因爲問題在於它沒有)。

這之後,我爲我定製的管創建了一個管廠(實施com.sun.xml.ws.assembler.TubeFactory)。

然後,我在我的項目中將webservices-rt.jar/META-INF/metro-default.xml的內容複製到META-INF/metro.xml中,併爲我的工廠類添加了一個<tube-factory>元素;根據<client-side>我把它放在輸送管工廠的正上方,在<endpoint-side>的下方,我把它放在輸送管工廠上方的列表頂部。

希望這有助於類似的問題任何人。能夠將自定義處理添加到Metro管道似乎非常強大但也很危險;因人而異。