[英]Authentication in KSOAP2 request to .NET webservice in Android
我正在尝试使用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标题中传递用户名和密码然后我尝试按照这个答案,但这不起作用。 然后我使用下面的[Lalit的答案]( android上的SOAP web服务 )编辑我的请求的标题,试图使它与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)是否将证书添加到我的JRE lib / security中的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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.