繁体   English   中英

在KSOAP2中对Android中的.NET Web服务请求进行身份验证

[英]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);

我希望现在还为时不晚。 请看以下链接的答案。

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

如果您仍然感兴趣,我可以共享构建标题的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM