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 dosimport
s 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?