c# - microsoft - la voz del cliente dynamics 365
¿Es posible llamar al servicio de Organización WCF de última hora de Dynamics CRM 2011 sin el SDK-enlace personalizado directo? (1)
Probablemente sea posible, pero enormemente complicado. Teníamos un proyecto que usaba Dynamics y que se movía a ADFS, y requería agregar muchos códigos adicionales alrededor de tokens refrescantes (forma de código autorefreshsecuritytoken.cs, deviceidmanager.cs y toolserviceproxies.cs del SDK) y que todavía estaba usando el SDK para todo.
Sin tener en cuenta, también necesita la identificación de Windows instalada en el sistema operativo, que es otra carga de funcionalidad para copiar.
Al final siempre puedes usar JustDecompile o similar para ver qué está haciendo el SDK.
Estoy tratando de implementar un escenario puro de WCF donde deseo llamar al servicio Dynamics CRM WCF sin depender de las clases de ayuda SDK. Básicamente, me gustaría implementar la autenticación federada contra Dynamics CRM 2011 usando solo soporte WCF nativo del .NET Framework.
La razón por la que hago esto es porque me gustaría transferir este escenario más adelante a BizTalk.
He generado con éxito clases de proxy con SvcUtil, pero la parte de las políticas y las afirmaciones de seguridad no son compatibles con el esquema de configuración. SvcUtil sugiere construir el enlace del código, que es lo que intento hacer.
El código resultante está aquí:
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();
}
}
Soy nuevo en la autenticación federada y estoy teniendo dificultades para descubrir las posibles diferencias entre las muchas vinculaciones disponibles, por lo que agradecería cualquier ayuda en este sentido.