2011-07-21 9 views
50

Tôi đang cố triển khai kịch bản WCF thuần túy nơi tôi muốn gọi Dịch vụ WCF Dynamics CRM WCF mà không cần dựa vào các lớp trợ giúp SDK. Về cơ bản, tôi muốn triển khai xác thực liên kết với Dynamics CRM 2011 chỉ sử dụng hỗ trợ WCF gốc từ khung .net.Có thể gọi dịch vụ Tổ chức WCF muộn về Dynamics CRM 2011 mà không có ràng buộc tùy chỉnh SDK - thẳng không?

Lý do tôi làm điều này là tôi muốn chuyển kịch bản này sau này sang BizTalk.

Tôi đã tạo thành công lớp proxy với SvcUtil, nhưng một phần của chính sách và xác nhận bảo mật không tương thích với lược đồ cấu hình. SvcUtil đề xuất xây dựng ràng buộc từ mã thay vào đó, đó là những gì tôi đang cố gắng làm.

Mã kết quả là đây:

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

Tôi mới để xác thực liên và đang gặp một thời gian khó khăn để tìm ra sự khác biệt tiềm năng giữa nhiều ràng buộc có sẵn, vì vậy tôi sẽ biết ơn sự giúp đỡ nào trong vấn đề này.

+1

Bạn đã bao giờ tìm hiểu cách thực hiện việc này chưa? – cheeesus

+0

Và bạn có ý nghĩa gì với các lớp trợ giúp SDK? – cheeesus

+1

Tôi đã không theo đuổi điều này và không bao giờ phát hiện ra. Những gì tôi gọi là Lớp trợ giúp SDK là các mẫu khác nhau được gửi cùng với SDK CRM 2011. –

Trả lời

2

Có thể, nhưng cực kỳ phức tạp. Chúng tôi đã có một dự án sử dụng Dynamics chuyển đến ADFS và yêu cầu thêm nhiều mã phụ xung quanh mã thông báo làm mới (mã mẫu autorefreshsecuritytoken.cs, deviceidmanager.cs và toolserviceproxies.cs từ SDK) và vẫn đang sử dụng SDK cho mọi thứ.

Xin lưu ý rằng bạn cũng cần windows.identification được cài đặt trong hệ điều hành là một tải chức năng khác để sao chép.

Cuối cùng, bạn luôn có thể sử dụng JustDecompile hoặc tương tự để xem SDK đang làm gì.