我们最近配置了我们的Dynamics CRM以将ADFS用于IFD。我们正试图从.Net 3.5连接到它,所以我们不能使用CRM SDK。下面是我们在配置IFD之前使用的代码,它工作正常。在不使用SDK的情况下连接到使用IFD配置的Dynamics CRM
HttpsTransportBindingElement httpTransport = new HttpsTransportBindingElement();
httpTransport.AuthenticationScheme = System.Net.AuthenticationSchemes.Ntlm;
httpTransport.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
httpTransport.MaxReceivedMessageSize = 1024 * 1024 * 1024;
SecurityBindingElement securityElement = SecurityBindingElement.CreateSspiNegotiationBindingElement(true);
TextMessageEncodingBindingElement textMessageEncoding = new TextMessageEncodingBindingElement();
textMessageEncoding.MaxReadPoolSize = 64;
textMessageEncoding.MaxWritePoolSize = 16;
textMessageEncoding.WriteEncoding = Encoding.UTF8;
CustomBinding customBinding = new CustomBinding(securityElement, textMessageEncoding, httpTransport);
customBinding.OpenTimeout = new TimeSpan(0, 0, 120);
customBinding.ReceiveTimeout = new TimeSpan(0, 0, 120);
customBinding.SendTimeout = new TimeSpan(0, 0, 120);
string remoteAddress = String.Empty;
remoteAddress = "https://" + ServiceUri + "/OrgName/XrmServices/2011/Organization.svc";
ChannelFactory<IOrganizationService> factory = new ChannelFactory<IOrganizationService>(customBinding, remoteAddress);
ClientCredentials loginCredentials = factory.Endpoint.Behaviors.Find<ClientCredentials>();
factory.Endpoint.Behaviors.Remove(loginCredentials);
// step two - instantiate your credentials
loginCredentials = new ClientCredentials();
loginCredentials.Windows.ClientCredential = new System.Net.NetworkCredential(UserName, Password, Domain);
factory.Endpoint.Behaviors.Add(loginCredentials);
IEnumerable<OperationDescription> operations = factory.Endpoint.Contract.Operations;
foreach (OperationDescription operation in operations)
{
DataContractSerializerOperationBehavior dcsob = operation.Behaviors.Find<DataContractSerializerOperationBehavior>();
if (dcsob == null)
{
dcsob = new DataContractSerializerOperationBehavior(operation);
}
operation.Behaviors.Remove(dcsob);
dcsob.MaxItemsInObjectGraph = 1012 * 1024 * 1024;
operation.Behaviors.Add(dcsob);
}
_orgProxy = factory.CreateChannel();
现在,当我们试图使用此代码它返回下面的错误连接到CRM: </StackTrace><ExceptionString>System.ServiceModel.Security.MessageSecurityException: Security processor was unable to find a security header in the message. This might be because the message is an unsecured fault or because there is a binding mismatch between the communicating parties. This can occur if the service is configured for security and the client is not using security.</ExceptionString></Exception></TraceRecord>
我的问题是什么额外的安全头,我需要和我怎么修改绑定包括他们?
如果你想看看微软是如何看待这篇文章http://blogs.msdn.com/b/crm/archive/2012/11/02/building-clients-for-windows-phone-and- windows-8-rt.aspx并下载源代码http://download.microsoft.com/download/1/A/A/1AA59217-D571-4E65-B037-FE59DD945A13/CRMSLSample.zip。它被发布供人们用于构建Windows 8 Phone和RT Apps(不支持.NET 4和WIF),但也可以用于.NET 3.5项目(不能使用.NET 4 DLL) – Nicknow