能否使用定制的绑定直接调用Dynamics CRM 2011的late-bound WCF组织服务而不需要SDK?

50

我想实现一个纯WCF场景,其中我想调用Dynamics CRM WCF服务,而不依赖SDK辅助类。基本上,我希望使用来自.NET框架的本地WCF支持来实现针对Dynamics CRM 2011的联合身份验证。

我这样做的原因是稍后我想将此方案移植到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();
        }
    }

我对联合认证不太了解,很难区分许多可用绑定之间的潜在差异,因此我将非常感谢任何关于这方面的帮助。


1
你有没有找到如何做到这一点? - Jonas Sourlier
还有,你指的是哪些SDK辅助类? - Jonas Sourlier
1
我没有追求这个,也从未弄清楚。我所说的SDK助手类是随CRM 2011 SDK一起提供的各种示例。 - Maxime Labelle
我已经在玩弄它几天了,但就我的懒惰和技能水平而言,你需要依靠辅助类,因为它们是免费和开源的,所以你可以随意使用。然而,我理解您可能只是想看看它是否可行。当然,还有下载发现服务广播的WSDL文件的选项,那么您就不需要SDK。如果可以的话,这里的任务是什么? - Konrad Viltersten
这个问题已经有42个投票了,而且还一直开着,真是太神奇了。我必须得找到一个答案。 - Sid
显示剩余2条评论
1个回答

2
可能是可以实现的,但是非常复杂。我们有一个使用Dynamics的项目转移到了ADFS,需要在刷新令牌周围添加大量额外的代码(来自SDK的autorefreshsecuritytoken.cs、deviceidmanager.cs和toolserviceproxies.cs)并且仍然在使用SDK进行所有操作。
请记住,您还需要在操作系统中安装Windows.identification,这是另一种要复制的功能负担。
最终,您始终可以使用JustDecompile或类似工具查看SDK正在执行的操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接