Cliente Apache CXF para xRM no modo de declarações (Microsoft Dynamics CRM 2011)?

Estou tentando criar um cliente Apache CXF (2.7.5) para os serviços Web do Microsoft Dynamics CRM 2011 ("xRM") (que eu entendi serem baseados no WCF 4) em que o CRM está no modo de declarações, para que o WSDL para este serviço da web aponta para um STS (no meu caso, AD FS 2.0).

Minha principal pergunta:Existe algum tutorial, sugestões, postagens de blog para me ajudar (descrevendo como enviar reivindicações ou como evitá-las e usar a autenticação do Windows)?

Abaixo está uma descrição do que eu fiz até agora.

Eu já tinha código de trabalho para o mesmo serviço da web, que funciona quando o CRM está emModo de autenticação do Windows. Esse código é baseado em"CXF e MS CRM 2011" no blog do Groovy Tom.

Suportarmodo de reivindicações, Eu também precisava incluirorg.apache.cxf: cxf-rt-ws-mex, para que o xRM WSDL possa ser analisado pelo CXF. Então, eu precisava fazer o cliente STS incorporado do CXF usar o SOAP 1.2:

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

para evitar um erro 500 do AD FS 2.0. (Aparentemente, o AD FS 2.0 espera que o ponto de extremidade / adfs / services / trust / mex seja chamado usando o SOAP 1.2, e o CXF padrão para o SOAP 1.1. Eu tive que descobrir isso emRastreio de WCF do AD FS, que relatou

System.ServiceModel.ProtocolException: tipo de conteúdo text / xml; charset = UTF-8 foi enviado para um serviço esperando aplicação / soap + xml; charset = utf-8. As ligações do cliente e do serviço podem ser incompatíveis.

quando o Apache CXF usou o SOAP 1.1.)

Havia outro problema: o WSDL retornado pelo ponto de extremidade / adfs / services / trust / mex do AD FS parecia incompleto, pois contém

<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>

então nenhum dosimports tem umschemaLocation. Isso faz a CXF reclamar que

org.apache.cxf.wsdl11.WSDLRuntimeException: solicitação de parte definida como elemento {http://docs.oasis-open.org/ws-sx/ws-trust/200512} RequestSecurityToken que não está no esquema.

Eu descobri o que causou isso: os esquemas que contêmRequestSecurityToken etc.estão no resultado da chamada SOAP mex, mas em separado<wsx:MetadataSection Dialect="http://www.w3.org/2001/XMLSchema"> seções, nas quais o códigoAbstractSTSClient ignora completamente.

Portanto, coloquei meu próprio WSDLFactory + WSDLReader (usando a propriedade {{javax.wsdl.factory.WSDLFactory}}), que apenas insere os esquemas dos três namespaces em qualquer WSDL que ele lê.

Agora estou bloqueado no próximo ponto: o xRM WSDL (após a formatação) contém umAddress dohttp://www.w3.org/2005/08/addressing/anonymous (veja abaixo), que de alguma forma faz com que o CXF procure esse ponto de extremidade nos metadados do AD FS. No entanto, esse ponto final obviamente não existe: contém, por exemplo,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>

Então, o que posso fazer agora?

De maneira mais geral, minha pergunta é agora:Estou no caminho certo para construir um cliente Java para o modo xRM no sistema de declarações? Como os outros fizeram isso funcionar? Ou existe talvez uma maneira deevitar usando declarações e, em vez disso, use a autenticação do Windows com o xRM no modo de declarações?

questionAnswers(2)

yourAnswerToTheQuestion