50 votes

Est-il possible d'appeler Dynamics CRM 2011 tardive WCF service à la clientèle sans le SDK straight personnalisé de liaison?

Je suis en train de mettre en œuvre un pur WCF scénario où je veux l'appeler Dynamics CRM service WCF sans compter sur le SDK helper classes. En gros, je voudrais mettre en œuvre l'authentification fédérée contre Dynamics CRM 2011 en utilisant uniquement des indigènes de la WCF soutien de la .net framework.

La raison pour laquelle je fais c'est que je voudrais le port de ce scénario ultérieur, BizTalk.

J'ai réussi à générer des classes proxy avec SvcUtil, mais la part des politiques et des assertions de sécurité ne sont pas compatibles avec le schéma de configuration. SvcUtil suggère de construire la liaison de code au lieu de cela, c'est ce que je suis en train de faire.

Le code résultant est ici:

        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();
        }
    }

Je suis nouveau à l'authentification fédérée et vais avoir un moment difficile de déterminer les différences de potentiel entre les liaisons, donc je serais reconnaissant pour toute aide à ce sujet.

2voto

Dave Glassborow Points 518

Il est sans doute possible, mais très complexe. Nous avions un projet à l'aide de la Dynamique qui s'installe à ADFS, et a exigé l'ajout de beaucoup de code supplémentaire autour rafraîchissante jetons (sous forme de code autorefreshsecuritytoken.cs, deviceidmanager.cs et toolserviceproxies.cs à partir du SDK) et qui était encore en utilisant le SDK pour tout.

Bare à l'esprit, vous avez aussi besoin de windows.identification installé dans l'OS qui est une autre charge de la fonctionnalité de copie.

En fin de compte, vous pouvez toujours utiliser JustDecompile ou similaire pour voir ce que le kit de développement est en train de faire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X