2011-07-21 8 views
50

Próbuję zaimplementować czysty scenariusz WCF, w którym chcę zadzwonić pod numer usługi WCF Dynamics CRM bez polegania na klasach pomocnika SDK. Zasadniczo chciałbym zaimplementować uwierzytelnianie stowarzyszone przeciwko Dynamics CRM 2011 przy użyciu tylko macierzystej obsługi WCF ze środowiska .net.Czy można wywołać późno powiązaną usługę organizacji WCF firmy Dynamics CRM 2011 bez SDK - proste niestandardowe powiązanie?

Powodem, dla którego to robię jest to, że chciałbym przenieść ten scenariusz później do BizTalk.

Pomyślnie wygenerowałem klasy proxy za pomocą SvcUtil, ale część zasad i asercje zabezpieczeń nie są zgodne ze schematem konfiguracji. SvcUtil sugeruje zbudowanie powiązania z kodu, co jest tym, co próbuję zrobić.

Otrzymany kod jest tutaj:

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

Jestem nowy uwierzytelniania stowarzyszonego i mam twardy czas na zastanawianie się ewentualnych różnic pomiędzy wielu dostępnych wiązań, więc byłbym wdzięczny za wszelką pomoc w z tego względu.

+1

Czy kiedykolwiek dowiedziałeś się, jak to zrobić? – cheeesus

+0

A jakie klasy pomocników SDK masz na myśli? – cheeesus

+1

Nie dążyłem do tego i nigdy się nie dowiedziałem. To, co nazywam klasami pomocniczymi SDK, to różne próbki dostarczane z pakietem SDK 2011 CRM. –

Odpowiedz

2

Jest to prawdopodobnie możliwe, ale bardzo skomplikowane. Mieliśmy projekt wykorzystujący Dynamics, który przeniósł się do ADFS i wymagał dodania mnóstwa dodatkowego kodu wokół odświeżających tokenów (kod formujący autorefreshsecuritytoken.cs, deviceidmanager.cs i toolserviceproroies.cs z SDK) i który wciąż używał SDK do wszystkiego.

Pamiętaj, że potrzebujesz również windows.identification zainstalowanego w systemie operacyjnym, co jest kolejnym ładunkiem funkcji do skopiowania.

Na koniec zawsze możesz po prostu użyć JustDecompile lub podobnego, aby zobaczyć, co robi SDK.

Powiązane problemy