Аутентификация в запросе KSOAP2 к веб-сервису .NET в Android - PullRequest
3 голосов
/ 08 февраля 2012

Я пытаюсь получить доступ к защищенному веб-сервису .NET SOAP в приложении для Android с помощью библиотеки KSOAP2. Я проверил другие ответы о переполнении стека, но до сих пор ни один из них не помог мне.

Для аутентификации требуются имя пользователя и пароль. Метод также принимает строку и возвращает сложный тип. Я получил это для работы с идентичной, но небезопасной службой (то есть, без имени пользователя / пароля, но передача String и возвращение сложного типа работает нормально).

Я могу подключиться к безопасному веб-сервису, используя soapUI. Все, что мне нужно сделать, это дать ему правильный параметр 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, поэтому попытался выполнить этот ответ , но это не сработало. Затем я использовал [ответ Лалита] ( веб-сервис SOAP на 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 / security или мне нужно написать некоторый код Java для доступа к этому сертификату?

2) Это вообще проблема с сертификатом, если SoapUI удалось успешно подключиться к веб-сервису без установки сертификата?

3) Если это не проблема с сертификатом, кто-нибудь может посоветовать, какой код мне нужно использовать для создания запроса Soap, который успешно аутентифицируется, а затем выполняет вызов метода? Я предполагаю, что это тот случай, когда мой сгенерированный Java-запрос выглядит максимально похожим на сгенерированный SoapUI-запрос.

Ответы [ 2 ]

4 голосов
/ 08 февраля 2012

Вы можете создать элемент 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 голосов
/ 27 ноября 2013

Надеюсь, еще не поздно. Посмотрите ответ по следующей ссылке.

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

Я могу поделиться кодом для создания заголовка, если вы все еще заинтересованы.

...