Заголовки Ws-Security с использованием Metro
У меня есть веб-сервис, который реализует WS-Security, но не определяет политику в WSDL. Я могу успешно использовать этот веб-сервис, используя Axis 2 в качестве клиента.
Я пытаюсь использовать тот же веб-сервис, используя Metro 2, но заголовки wsse:security не собираются. Это работает, только если служба определяет политику безопасности, которая не находится под моим контролем. Я проверил это, создав образец веб-службы, и, пока я не определил политику, мой клиент метро никогда не отправляет заголовки wsse:security.
Есть ли что-то, что я пропускаю, используя Метро?
РЕДАКТИРОВАТЬ------------------------------------------------- -----------------------------------------
Я создал локальную копию wsdl и в этом определил политику. Я создал клиент веб-службы, используя этот wsdl, но заголовки безопасности все еще не работают. Файл wsit-client.xml выглядит нормально. Я даже сравнил все конфигурации с клиентом веб-службы, которая определяет политику, и конфигурации одинаковы, но все же это не работает. На данный момент мой вывод заключается в том, что клиенту Metro нужен фактический веб-сервис, определяющий политику.
РЕДАКТИРОВАТЬ------------------------------------------------- ---------------------------------------
Содержимое wsit-client.xml
<?xml version="1.0" encoding="UTF-8"?>
<definitions
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" name="mainclientconfig"
>
<import location="NewWebService.xml" namespace="http://test.com/"/>
NewWebService.xml расположен вместе с wsit-client.xml и содержит следующую информацию о политике
<wsp:Policy wsu:Id="NewWebServicePortBindingPolicy">
<wsp:ExactlyOne>
<wsp:All>
<sc:CallbackHandlerConfiguration wspp:visibility="private">
<sc:CallbackHandler default="dsfsd" name="usernameHandler"/>
<sc:CallbackHandler default="sdfsdfds" name="passwordHandler"/>
</sc:CallbackHandlerConfiguration>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
который упоминается в привязке, как это -
<binding name="NewWebServicePortBinding" type="tns:NewWebService">
<wsp:PolicyReference URI="#NewWebServicePortBindingPolicy"/>
Измененный wsdl содержит эту политику -
<wsp:Policy xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702" wsu:Id="NewWebServicePortBindingPolicy">
<sp:SignedEncryptedSupportingTokens>
<wsp:Policy>
<sp:UsernameToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:WssUsernameToken10 />
</wsp:Policy>
</sp:UsernameToken>
</wsp:Policy>
</sp:SignedEncryptedSupportingTokens>
<sp:TransportBinding>
<wsp:Policy>
<sp:AlgorithmSuite>
<wsp:Policy>
<sp:Basic128 />
</wsp:Policy>
</sp:AlgorithmSuite>
<sp:IncludeTimestamp />
<sp:Layout>
<wsp:Policy>
<sp:Lax />
</wsp:Policy>
</sp:Layout>
<sp:TransportToken>
<wsp:Policy>
<sp:HttpsToken RequireClientCertificate="false" />
</wsp:Policy>
</sp:TransportToken>
</wsp:Policy>
</sp:TransportBinding>
<sp:Wss10 />
<wsam:Addressing wsp:Optional="true" />
</wsp:Policy>
2 ответа
Вам нужно будет добавить ws:Policy
к локальной копии WSDL и вашему wsit-client.xml
, Этот поток (и этот ответ в частности) может помочь вам настроить все это.
Попробуйте взглянуть на мой вопрос, который я написал здесь о очень похожей ситуации: вызов веб-службы.NET (WSE 3.0, WS-Security) из JAXWS-RI. Я все еще (!) Пытаюсь пройти через это, потому что я получаю сообщение об ошибке со стороны сервера, но я обновил вопрос с некоторыми подробностями процесса, который я прошел, пытаясь заставить это работать. Там есть ссылка на пост, который я разместил на форумах Metro java.net, который был мне полезен. Однако я смог получить заголовки wsse.
Короче говоря, я думаю, что включение раздела ws:Policy в вашу локальную копию WSDL (и отправка этого WSDL в качестве параметра при создании Службы). Вот фрагмент кода, в котором я создаю свои клиентские объекты - здесь это должно быть упрощено, потому что я использую фабрики Spring для вставки клиентской ссылки в другой сервис, так или иначе, вот jist:
String wsdlDocumentLocation = "localVersion.wsdl";
QName serviceName = new QName("mynamespace", "myServiceName");
Service service = Service.create(wsdlDocumentLocation, serviceName);
//send the port the fully qualified name of the Metro generated
//client interface
Object port = service.getPort("my.client.package.ClientServiceInterface");
Это вместе с вашим wsit-client.xml должно работать. Куда вы кладете свой файл wsit-client.xml? Если он находится на пути к классам (мой находится в WEB-INF/classes), вы должны увидеть в консоли оператор log, который говорит, что он читается. Вот сообщение, которое я вижу в своей консоли:
[13: 12: 06.779] WSP5018: загруженная конфигурация WSIT из файла: файл:/C:/projects/target/my-webapp/WEB-INF/classes/wsit-client.xml.