Заголовки Ws-Security с использованием Metro - PullRequest
2 голосов
/ 29 марта 2010

У меня есть веб-сервис, который реализует WS-Security, но не определяет политику в WSDL. Я могу успешно использовать этот веб-сервис, используя Axis 2 в качестве клиента.

Я пытаюсь использовать тот же веб-сервис, используя Metro 2, но заголовки wsse: security не работают. Это работает, только если служба определяет политику безопасности, которая не находится под моим контролем. Я проверил это, создав образец веб-службы, и, пока я не определил политику, мой клиент метро никогда не отправляет заголовки wsse: security.

Есть ли что-то, чего мне не хватает в Metro?

EDIT ---------------------------------------------- --------------------------------------------

Я создал локальную копию wsdl и определил политику. Я создал клиент веб-службы, используя этот wsdl, но заголовки безопасности все еще не работают. Файл wsit-client.xml выглядит нормально. Я даже сравнил все конфигурации с клиентом веб-службы, которая определяет политику, и конфигурации одинаковы, но все же это не работает. На данный момент я пришел к выводу, что клиенту Metro нужен фактический веб-сервис, определяющий политику.

EDIT ---------------------------------------------- ------------------------------------------

Содержимое 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 ]

0 голосов
/ 29 марта 2010

Попробуйте взглянуть на мой вопрос, который я написал здесь о очень похожей ситуации - Вызов веб-службы .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.

0 голосов
/ 29 марта 2010

Вам нужно будет добавить ws:Policy к локальной копии WSDL и к вашему wsit-client.xml. Эта тема этот ответ в частности) может помочь вам настроить все это.

...