我正在尝试使用KSOAP2库在Android应用程序中访问安全的.NET SOAP Web服务.我已经检查了有关Stack Overflow的其他答案,但是到目前为止,它们都没有帮助我.
验证需要用户名和密码.该方法还采用String并返回复杂类型.我已经将其与相同但不安全的服务一起使用(即,没有用户名/密码,但是传递String并返回复杂类型可以正常工作).
我可以使用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 pathnot found.
这使它看起来像是证书问题,因此我使用InstallCert从服务器导入了证书,并使用Keytool验证了它在我的密钥库中.这没什么区别.另一方面,我认为这不是证书问题,因为SoapUI在安装该证书之前就可以使用了.
现在我很困惑,所以这是我的问题:
1)将证书添加到我的JRE库/安全性中的cacerts密钥库中是否足够,还是我需要编写一些Java代码才能访问此证书?
2)如果SoapUI能够在不安装我的证书的情况下成功连接到Web服务,那么这完全是一个证书问题吗?
3)如果这不是证书问题,谁能建议我使用哪种代码来生成可以成功进行身份验证然后执行方法调用的Soap请求?我认为这是使我的java生成的请求看起来与SoapUI生成的请求尽可能相似的情况.
解决方法:
您可以创建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);
总结 以上是内存溢出为你收集整理的Android中对.NET Web服务的KSOAP2请求中的身份验证全部内容,希望文章能够帮你解决Android中对.NET Web服务的KSOAP2请求中的身份验证所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)