Вызов веб-службы .NET (WSE 2/3, WS-Security) из Java

голоса
21

Мне нужно позвонить веб-сервиса, написанный на .NET с Java. Веб-сервис реализует стек WS-Security (или WSE 2 или WSE 3, не ясно, из имеющейся у меня информации).

Информация, которую я получил от поставщика услуг включены WSDL, файл policyCache.config, некоторые образцы C # код, и пример приложения, которое может успешно вызывать службу.

Это не так полезно, как это звучит, потому что это не ясно, как я должен использовать эту информацию, чтобы написать клиент Java. Если запрос на веб-сервис не будет подписан в соответствии с политикой, то она отвергается службы. Я пытаюсь использовать Apache Axis2, и я не могу найти никаких инструкций о том, как я должен использовать файл policyCahce.config и WSDL для создания клиента.

Есть несколько примеров, которые я нашел в Интернете, но во всех случаях авторы примеров имели контроль как сервиса и клиента, и поэтому были в состоянии сделать ухищрений с обеих сторон для того, чтобы заставить его работать. Я не в том положении.

Кто-нибудь делал это успешно?

Задан 19/08/2008 в 16:54
источник пользователем
На других языках...                            


6 ответов

голоса
9

Это, кажется, популярный вопрос, поэтому я приведу краткий обзор того, что мы делали в нашей ситуации.

Кажется , что услуги , построенные в .NET Подписчиков старше WS-адресации стандарта ( http://schemas.xmlsoap.org/ws/2004/03/addressing/ ) и axis2 понимает только новый стандарт ( HTTP: // схемы. xmlsoap.org/ws/2004/08/addressing/ ).

Кроме того, файл policyCache.config предоставляется в форме, модуль в Axis2 Rampart не может понять.

Поэтому шаги, которые мы должны были сделать, в двух словах:

  • Прочитайте policyCache.config и попытаться понять его. Затем переписать его в политику, оплот мог понять. (Некоторые обновленные документы помогли.)
  • Настройка Рампартого этой политики.
  • Возьмите ключи, которые были предоставлены в файле .pfx и преобразовать их в хранилище ключей Java. Существует утилита, которая поставляется с Jetty, который может сделать это.
  • Настройка Рампарт этого хранилища ключей.
  • Написать пользовательский обработчик axis2, что обратно преобразует новую WS-адресации материала, который выходит из axis2 в старые вещи, ожидаемой службой.
  • Настройка Axis2 использовать обработчик исходящих сообщений.

В конце концов, это было много конфигурации и кода для чего-то, что, как предполагается, является открытым стандартом поддерживается производителями.

Хотя я не уверен, что альтернатива ... Вы можете ждать продавцов (или в данном случае, на одного поставщика), чтобы убедиться, что все будет интер-оп?

В качестве постскриптума я добавлю, что я не в конечном итоге делает работу, это был кто-то в моей команде, но я думаю, что я получил Заметные детали исправить. Другой вариант, который я рассматривал (прежде чем мой товарищ по команде взял) должен был вызвать WSS4J API непосредственно для построения SOAP конверт как служба .NET ожидал. Я думаю, что работал бы тоже.

Ответил 02/04/2009 d 21:08
источник пользователем

голоса
9

спецификации WS-Security обычно не содержится в WSDL (никогда в WSE WSDL). Так wsdl2java не знает, что WS-Security даже требуется для этой службы. Тот факт, что ограничения безопасности нет в WSE WSDL является большим разочарованием для меня (WCF будет включать в себя WS-Trust информации в WSDL).

На стороне клиента, вы должны будете использовать Rampart добавить необходимые заголовки WS-Security для вашего исходящего сообщения клиента. Поскольку WSDL не сообщает , какие настройки WS-Security необходимы, Вам лучше всего, обратившись к поставщику услуг , что требуется. Требования WS-Security может быть простой текстовый пароль, или могут быть сертификаты X509, или может быть зашифровано сообщение ..... Rampart должен быть в состоянии работать с большинством из этих сценариев.

Apache Rampart будет «включено» путем привлечения модуля в файле axis2.xml. Вам нужно загрузить модуль Rampart и поместить его в определенном месте в каталоге axis2, а затем изменить файл XML. Вы также можете задействовать Rampart программно (измените исходный вопрос, если это требование, и я буду редактировать этот ответ).

В зависимости от того, как настроить вал (через другие файлы XML или Programatically), он будет перехватывать любые исходящие сообщения и добавить необходимую информацию WS-Security к нему. Я лично использовал Axis2 с валом для вызова службы WSE3, прикрепленная с UsernameToken в незашифрованном виде, и она работала великолепно. Аналогичные, но более сложные сценарии должны также работать. Есть более подробная информация о том, как установить и начать работу с Валом на сайте, указанный выше. Если у вас есть проблемы о специфике Вала или как использовать Rampart с конкретной WSE настройки, а затем изменить свой вопрос, и я буду стараться изо всех сил, чтобы ответить.

Ответил 17/09/2008 d 15:23
источник пользователем

голоса
2

@Майк

Недавно я сделал тест, и это код, который я использовал. Я не использую политики вещи, но я использовал WS-Security с аутентификацией обычного текста. CXF имеет очень хорошую документацию о том, как выполнить эти вещи.

Я использовал wsdl2java, а затем добавил этот код, чтобы использовать веб-службу с WS-Security.

Я надеюсь, что это помогает вам.

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;

import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
import org.apache.ws.security.WSConstants;
import org.apache.ws.security.WSPasswordCallback;
import org.apache.ws.security.handler.WSHandlerConstants;

public class ServiceTest implements CallbackHandler
{

     public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {

            WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
            // set the password for our message.
            pc.setPassword("buddah");
        }

    public static void main(String[] args){
        PatientServiceImplService locator = new PatientServiceImplService();
        PatientService service = locator.getPatientServiceImplPort();

        org.apache.cxf.endpoint.Client client = org.apache.cxf.frontend.ClientProxy.getClient(service);
        org.apache.cxf.endpoint.Endpoint cxfEndpoint = client.getEndpoint();

        Map<String, Object> outProps = new HashMap<String, Object>();
        outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN + " " +  WSHandlerConstants.TIMESTAMP);
        outProps.put(WSHandlerConstants.USER, "joe");
        outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);

        // Callback used to retrieve password for given user.
        outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, ServiceTest.class.getName());

        WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
        cxfEndpoint.getOutInterceptors().add(wssOut);


        try
        {
            List list = service.getInpatientCensus();
            for(Patient p : list){
                System.out.println(p.getFirstName() + " " + p.getLastName());
            }

        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
Ответил 19/08/2008 d 22:18
источник пользователем

голоса
1
Ответил 19/08/2008 d 17:19
источник пользователем

голоса
0

Я предполагаю, что я должен быть более ясным - я использовал генераторы wsdl2java кода для генерации кода клиента для службы. Однако сгенерированный код не включает необходимые заголовки SOAP WS-Security, так что служба будет принимать запросы.

Ответил 19/08/2008 d 19:26
источник пользователем

голоса
0

CXF - Я хотел бы посмотреть в CXF. Я использовал его для создания веб - сервиса и клиента в Java с помощью WS-secuirty. Я также подключен веб - службы .net к нему.

Они имеют очень хорошую документацию тоже. У меня было больше удачи с ней, чем оси.

Ответил 19/08/2008 d 17:06
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more