2012-02-08 93 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