Клиент 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-в-утверждениях?