是否可以在没有SDK的情况下调用Dynamics CRM 2011后绑定WCF组织服务-直接自定义绑定?



我试图实现一个纯粹的WCF场景,我想调用Dynamics CRM WCF服务,而不依赖于SDK助手类。基本上,我想对Dynamics CRM 2011实现联邦身份验证,只使用来自。net框架的本机WCF支持。

我这样做的原因是我想稍后将这个场景移植到BizTalk。

我已经成功地用SvcUtil生成了代理类,但是策略和安全断言的部分与配置模式不兼容。SvcUtil建议从代码中构建绑定,这就是我正在尝试做的。

结果代码如下:

        private static void CallWcf()
    {
        OrganizationServiceClient client = null;
        try
        {
            // Login Live.com Issuer Binding
            var wsHttpBinding = new WSHttpBinding();
            wsHttpBinding.Security = new WSHttpSecurity();
            wsHttpBinding.Security.Mode = SecurityMode.Transport;
            // Endpoint Binding Elements
            var securityElement = new TransportSecurityBindingElement();
            securityElement.DefaultAlgorithmSuite = SecurityAlgorithmSuite.TripleDes;
            securityElement.IncludeTimestamp = true;
            securityElement.KeyEntropyMode = SecurityKeyEntropyMode.CombinedEntropy;
            securityElement.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10;
            securityElement.SecurityHeaderLayout = SecurityHeaderLayout.Strict;
            var securityTokenParameters = new IssuedSecurityTokenParameters();
            securityTokenParameters.InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient;
            securityTokenParameters.ReferenceStyle = SecurityTokenReferenceStyle.Internal;
            securityTokenParameters.RequireDerivedKeys = false;
            securityTokenParameters.TokenType = null;
            securityTokenParameters.KeyType = SecurityKeyType.SymmetricKey;
            securityTokenParameters.KeySize = 192;
            securityTokenParameters.IssuerAddress = new EndpointAddress("https://login.live.com/extSTS.srf");
            securityTokenParameters.IssuerMetadataAddress = null;
            securityTokenParameters.DefaultMessageSecurityVersion = null;
            securityTokenParameters.IssuerBinding = wsHttpBinding;
            securityElement.EndpointSupportingTokenParameters.Signed.Add(securityTokenParameters);
            var textMessageEncodingElement = new TextMessageEncodingBindingElement();
            textMessageEncodingElement.MaxReadPoolSize = 64;
            textMessageEncodingElement.MaxWritePoolSize = 16;
            textMessageEncodingElement.MessageVersion = MessageVersion.Default;
            textMessageEncodingElement.WriteEncoding = System.Text.Encoding.UTF8;
            textMessageEncodingElement.ReaderQuotas.MaxStringContentLength = 8192;
            textMessageEncodingElement.ReaderQuotas.MaxArrayLength = 16384;
            textMessageEncodingElement.ReaderQuotas.MaxBytesPerRead = 4096;
            textMessageEncodingElement.ReaderQuotas.MaxNameTableCharCount = 16384;
            var httpsTransportElement = new HttpsTransportBindingElement();
            httpsTransportElement.ManualAddressing = false;
            httpsTransportElement.AuthenticationScheme = System.Net.AuthenticationSchemes.Anonymous;
            CustomBinding binding = new CustomBinding();
            binding.Elements.Add(securityElement);
            binding.Elements.Add(textMessageEncodingElement);
            binding.Elements.Add(httpsTransportElement);
            client = new OrganizationServiceClient(binding, new EndpointAddress(EndpointUri));
            client.ClientCredentials.UserName.UserName = Username;
            client.ClientCredentials.UserName.Password = Password;
            client.Open();
            var columnSet = new schemas.microsoft.com.xrm._2011.Contracts.ColumnSet();
            var identifier = new Guid("fbf8240e-2c85-e011-ad55-1cc1de0878eb");
            columnSet.Columns = new string[] { "name" };
            var entity = client.Retrieve("account", identifier, columnSet);
        }
        finally
        {
            if (client != null)
                client.Close();
        }
    }

我是联邦身份验证的新手,很难弄清楚许多可用绑定之间的潜在差异,因此,如果您能在这方面提供帮助,我将不胜感激。

这可能是可能的,但非常复杂。我们有一个使用Dynamics的项目,该项目转移到ADFS,并且需要围绕刷新令牌添加许多额外的代码(来自SDK的autorefreshsecuritytoken.cs, deviceidmanager.cs和toolserviceproxy .cs的代码),并且仍然使用SDK来处理所有事情。

别忘了你也需要窗户。安装在操作系统中的标识符,这是另一个要复制的功能负载。

最后,你总是可以使用JustDecompile或类似的方法来查看SDK正在做什么。

最新更新