2012-02-08 135 views
3

我正嘗試使用KSOAP2庫訪問Android應用程序中的安全.NET SOAP Web服務。我已經檢查了堆棧溢出的其他答案,但到目前爲止,他們都沒有幫助我。Android中的KSOAP2請求.NET Web服務中的身份驗證

認證需要用戶名和密碼。該方法也接受一個字符串並返回一個複雜的類型。我已經得到這個工作與一個相同但不安全的服務(即沒有用戶名/密碼,但傳遞字符串和返回複雜類型工作正常)。

我可以使用soapUI連接到安全的web服務。我所要做的就是給它一個正確的String參數,通過SoapUI請求屬性設置用戶名和密碼,並且將WSS-PasswordType設置爲「PasswordText」。

我很困惑如何通過我的Java代碼實現這一點。 soapUI的要求(工作)看起來是這樣的:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"> 
    <soapenv:Header><wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
     <wsse:UsernameToken wsu:Id="UsernameToken-1" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
     <wsse:Username>(my username) </wsse:Username> 
     <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">(my password) </wsse:Password> 
     <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">eic5EdyTomcBLocwyph5Mw==</wsse:Nonce> 
     <wsu:Created>2012-02-08T09:47:55.225Z</wsu:Created> 
     </wsse:UsernameToken></wsse:Security> 
    </soapenv:Header> 
    <soapenv:Body> 
     <tem:GetClientByNationalID> 
      <!--Optional:--> 
     <tem:nationalID>(the nationalID) </tem:nationalID> 
     </tem:GetClientByNationalID> 
    </soapenv:Body> 
</soapenv:Envelope> 

我想我應該在SOAP頭路過的用戶名和密碼,然後讓我嘗試以下this answer但這並沒有工作。然後,我使用[Lalit的回答](SOAP web service on android)編輯我的請求的標題,以使其與SoapUI生成的請求相同,但我仍然收到相同的錯誤。這裏是我的代碼現生產:

<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/"> 
    <v:Header> 
    <n0:Security mustUnderstand="1" xmlns:n0="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
     <n0:UsernameToken n1:Id="UsernameToken-1" xmlns:n1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
      <n0:Username>(my username)</n0:Username> 
      <n0:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">(mypassword)</n0:Password> 
      <n0:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">eic5EdyTomcBLocwyph5Mw==</n0:Nonce> 
      <wsu:Created>2012-02-08T09:47:55.225Z</wsu:Created> 
     </n0:UsernameToken> 
    </n0:Security> 
</v:Header> 
<v:Body> 
    <GetClientByNationalID xmlns="http://tempuri.org/" id="o0" c:root="1"> 
     <nationalID i:type="d:string">(testnationalID)</nationalID> 
    </GetClientByNationalID> 
</v:Body> 

這是我仍然在logcat中得到錯誤:

02-10 10:53:49.261: W/System.err(1187): javax.net.ssl.SSLHandshakeException: 
java.security.cert.CertPathValidatorException: Trust anchor for certification path 
not found. 

這使它看起來像一個證書的問題,所以我用InstallCert從服務器導入證書,並用Keytool驗證它在我的密鑰庫中。這沒有什麼區別。另一方面,我認爲這不是證書問題,因爲在安裝證書之前,SoapUI工作。

現在我很困惑,所以這裏是我的問題:

1)添加證書到cacerts的密鑰存儲在我的JRE的lib /安全性不夠,或者我需要寫一些Java代碼,然後訪問這個證書?

2)這是一個證書問題,如果SoapUI能夠成功連接到webservice而無需安裝證書?

3)如果它不是一個證書問題,任何人都可以建議我需要使用什麼樣的代碼來生成一個Soap請求,以便成功驗證並執行方法調用?我認爲這是一個讓我的java生成的請求看起來與SoapUI生成的請求儘可能相似的例子。

+0

你有沒有檢查這些鏈接[首頁](http://stackoverflow.com/questions/6441158/how-can-i-access-an-ssl-connection-through-android),[Second](http:/ /stackoverflow.com/questions/6825226/trust-anchor-not-found-for-android-ssl-connection) – 2012-02-08 12:46:32

+0

我不確定這些鏈接是否適用於我使用KSOAP2時 - 是否仍然需要設置我的SSL連接手動? – breadbin 2012-02-08 14:05:04

+0

@breadbin嗨,你是如何添加 AndroidDev 2014-05-22 10:15:04

回答

4

您可以創建Header元素,並添加Authentication細節,

Element[] header = new Element[1]; 
header[0] = new Element().createElement(NAMESPACE,"AuthHeader"); 

添加帳號用戶名標籤,

Element username = new Element().createElement(NAMESPACE, "username_tag"); 
username.addChild(Node.TEXT, "username_value"); 
header[0].addChild(Node.ELEMENT, username); 

添加使用密碼密碼標籤,

Element password = new Element().createElement(NAMESPACE, "password_tag"); 
password.addChild(Node.TEXT, "password_value"); 
header[0].addChild(Node.ELEMENT, password); 

的頭添加到SoapSerializationEnvelope

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope 
                     .VER11); 
envelope.dotNet = true; 
envelope.headerOut = header; 
envelope.setOutputSoapObject(request); 
+0

我試過了,仍然得到相同的錯誤。那麼這條線怎麼樣:\t \t (我的密碼)? 我知道如果我不將WSS-PasswordType設置爲「PasswordText」,那麼它不起作用,所以我想我需要以某種方式在Java代碼中執行此操作。你知不知道怎麼? – breadbin 2012-02-08 12:57:48

+0

嘗試[this](http://stackoverflow.com/questions/3564467/soap-wev-service-on-android)回答。 – 2012-02-08 17:04:36

+0

感謝您的回答@Lalit Poptani,但不幸的是我仍然得到相同的錯誤。我已經更新了我上面生成的java請求,以顯示我現在正在生成的內容,但仍然無法正常工作。任何其他想法? – breadbin 2012-02-10 10:59:22

0

我希望這不是爲時已晚。請查看以下鏈接上的答案。

https://stackoverflow.com/a/17691465/2499764

我可以共享代碼,如果你仍然有興趣構建頭。

+0

對我來說太晚了,不過謝謝你的回答。我希望它能幫助別人。 – breadbin 2013-12-05 15:26:34