Я пытаюсь создать клиент Apache CXF (2.7.5) для веб-сервисов Microsoft Dynamics CRM 2011 («xRM») (который, как я понял, основан на WCF 4), где CRM находится в режиме претензий, так что WSDL для этой веб-службы указывает на STS (в моем случае AD FS 2.0).Клиент Apache CXF для режима требований xRM (Microsoft Dynamics CRM 2011)?
Мой главный вопрос: Есть ли какой-либо учебник, предложения, сообщения в блогах, чтобы помочь мне (описав, как отправлять претензии, или как их избежать, и вместо этого использовать проверку подлинности Windows)?
Ниже приведено описание того, что я делал до сих пор.
я уже работающий код для того же веб-сервис, который работает, когда CRM в режиме проверки подлинности Windows. Этот код основан на "CXF and MS CRM 2011" on Groovy Tom's Blog.
Для поддержки режима с претензиями, мне также необходимо включить org.apache.cxf:cxf-rt-ws-mex, так что xRM WSDL может быть проанализирован CXF. Тогда мне нужно сделать CXF встроенный STS-клиент использовал SOAP 1.2:
client.getRequestContext().put("ws-security.sts.client-soap12-binding", "true");
, чтобы избежать ошибки 500 из AD FS 2.0. (По-видимому AD FS 2.0 ожидает/ADFS/услуги/доверие/MEX конечной точкой будет вызываться с использованием SOAP 1.2, и CxF по умолчанию SOAP 1.1. Я должен был это выяснить из AD FS's WCF trace, который сообщил
System.ServiceModel .ProtocolException: Тип содержимого текст/XML; кодировка = UTF-8, был отправлен в службу ожидая приложения/мыло + 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, который он читает.
Теперь я заблокирован в следующем пункте: XRM WSDL (после форматирования) содержит 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-in-Claim-mode?
Не предполагайте, что вы могли бы прояснить, что «Итак, что мы сделали, это предварительная обработка AD FS WSDL, а просто добавленные пустые элементы в этих местах означает? Я получаю ту же ошибку, застрял на пару дней –
В частности, где я могу добавить пустой в/mex wsdl. Справка * сильно * оценена. –
@AlanHollis Как я уже писал, мне нужно было добавить ' ' непосредственно внутри всех элементов с помощью 'wsp: Optional = true ". См. например https://corp.sts.microsoft.com/adfs/services/trust/mex, где вы можете увидеть такие элементы, как' и ''. –