Клиент Apache CXF для режима утверждений xRM (Microsoft Dynamics CRM 2011)?

Я пытаюсь создать клиент Apache CXF (2.7.5) для веб-служб Microsoft Dynamics CRM 2011 ("xRM") (который, как я понял, основан на WCF 4), где CRM находится в режиме утверждений, так что WSDL для этого веб-сервиса указывает на STS (в моем случае AD FS 2.0).

Мой главный вопрос:Существуют ли какие-либо руководства, предложения, сообщения в блоге, которые могут мне помочь (либо описывают, как отправлять претензии, либо как их избежать и вместо этого использовать проверку подлинности Windows)?

Ниже приводится описание того, что я сделал до сих пор.

У меня уже был рабочий код для того же веб-сервиса, который работает, когда CRM находится вРежим аутентификации Windows, Этот код основан на"CXF and MS CRM 2011" в блоге Groovy Tom.

Поддерживатьрежим претензийМне дополнительно нужно было включитьorg.apache.cxf: CXF-RT-WS-MEX, так что xRM WSDL может быть проанализирован CXF. Затем мне нужно было заставить встроенный клиент STS CXF использовать SOAP 1.2:

client.getRequestContext().put("ws-security.sts.client-soap12-binding", "true");

чтобы избежать ошибки 500 от AD FS 2.0. (Очевидно, AD FS 2.0 ожидает, что конечная точка / adfs / services / trust / mex будет вызываться с использованием SOAP 1.2, а CXF по умолчанию - SOAP 1.1. Я должен был это выяснить изТрассировка WC FS AD FS, который сообщил

System.ServiceModel.ProtocolException: Тип содержимого text / xml; charset = UTF-8 был отправлен в службу, ожидающую приложения / soap + xml; кодировка = UTF-8. Привязки клиента и службы могут не совпадать.

когда Apache CXF использовал SOAP 1.1.)

Затем возникла еще одна проблема: WSDL, возвращенный конечной точкой AD FS / adfs / services / trust / mex, казался неполным, поскольку он содержит

<wsdl:types>
    <xsd:schema
        targetNamespace="http://schemas.microsoft.com/ws/2008/06/identity/securitytokenservice/Imports">
        <xsd:import namespace="http://schemas.microsoft.com/Message" />
        <xsd:import namespace="http://schemas.xmlsoap.org/ws/2005/02/trust" />
        <xsd:import namespace="http://docs.oasis-open.org/ws-sx/ws-trust/200512" />
    </xsd:schema>
</wsdl:types>

так что ни один изimportс имеетschemaLocation, Это заставляет CXF жаловаться, что

org.apache.cxf.wsdl11.WSDLRuntimeException: запрос детали, определенный как элемент {http://docs.oasis-open.org/ws-sx/ws-trust/200512} RequestSecurityToken, которого нет в схеме.

Я выяснил, что вызвало это: схемы, содержащиеRequestSecurityToken и т.п.являются в результате вызова mex SOAP, но в отдельном<wsx:MetadataSection Dialect="http://www.w3.org/2001/XMLSchema"> разделы, в которых кодAbstractSTSClient полностью игнорирует

Поэтому я установил свой собственный WSDLFactory + WSDLReader (используя свойство {{javax.wsdl.factory.WSDLFactory}}), который просто вставляет схемы для трех пространств имен в любой WSDL, который он читает.

Теперь я заблокирован в следующем пункте: WSRL xRM (после форматирования) содержитAddress изhttp://www.w3.org/2005/08/addressing/anonymous (см. ниже), что как-то заставляет CXF искать эту конечную точку в метаданных AD FS. Однако такой конечной точки, конечно же, не существует: она содержит, например,https://...:.../adfs/services/trust/2005/usernamemixed.

<wsdl:definitions
    targetNamespace="http://schemas.microsoft.com/xrm/2011/Contracts/Services"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
    snipped="other xmlns attributes">
    <wsp:Policy wsu:Id="CustomBinding_IOrganizationService_policy">
        <wsp:ExactlyOne>
            <wsp:All>
                <!-- snip -->
                <sp:EndorsingSupportingTokens
                    xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
                    <wsp:Policy>
                        <sp:IssuedToken
                            sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
                            <Issuer
                                xmlns="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
                                <Address xmlns="http://www.w3.org/2005/08/addressing">
                                    http://www.w3.org/2005/08/addressing/anonymous
                                </Address>

Так что я могу сделать сейчас?

В общем, мой вопрос сейчас:Я на правильном пути для создания клиента Java для режима xRM-в-утверждений? Как другие заставили это работать? Или, возможно, есть способизбежать использование утверждений, и вместо этого использовать проверку подлинности Windows с режимом xRM-в-утверждениях?

Ответы на вопрос(2)

Ваш ответ на вопрос