C# hizmetinde güvenli hizmet uzaktan iletişim iletişimleri

Güvenlik, iletişimin en önemli yönlerinden biridir. Reliable Services uygulama çerçevesi, güvenliği geliştirmek için kullanabileceğiniz önceden oluşturulmuş birkaç iletişim yığını ve aracı sağlar. Bu makalede, bir C# hizmetinde hizmet uzaktan iletişimini kullanırken güvenliğin nasıl artırılacağı açıklanır. C# dilinde yazılmış güvenilir hizmetler için uzaktan iletişimin nasıl ayarlandığını açıklayan mevcut bir örnek üzerine kurulur.

C# hizmetleriyle hizmet uzaktan iletişimini kullanırken hizmetin güvenliğini sağlamaya yardımcı olmak için şu adımları izleyin:

  1. Hizmetinizdeki bir uzak yordam çağrısı için kullanılabilecek yöntemleri tanımlayan bir arabirim IHelloWorldStatefuloluşturun. Hizmetiniz, ad alanında Microsoft.ServiceFabric.Services.Remoting.FabricTransport.Runtime bildirilen öğesini kullanırFabricTransportServiceRemotingListener. Bu, uzaktan iletişim özellikleri sağlayan bir ICommunicationListener uygulamadır.

    public interface IHelloWorldStateful : IService
    {
        Task<string> GetHelloWorld();
    }
    
    internal class HelloWorldStateful : StatefulService, IHelloWorldStateful
    {
        protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
        {
            return new[]{
                    new ServiceReplicaListener(
                        (context) => new FabricTransportServiceRemotingListener(context,this))};
        }
    
        public Task<string> GetHelloWorld()
        {
            return Task.FromResult("Hello World!");
        }
    }
    
  2. Dinleyici ayarlarını ve güvenlik kimlik bilgilerini ekleyin.

    Hizmet iletişiminizin güvenliğini sağlamaya yardımcı olmak için kullanmak istediğiniz sertifikanın kümedeki tüm düğümlere yüklendiğinden emin olun.

    Not

    Linux düğümlerinde, sertifika /var/lib/sfcerts dizininde PEM biçimli dosyalar olarak bulunmalıdır. Daha fazla bilgi edinmek için bkz . Linux düğümlerinde X.509 sertifikalarının konumu ve biçimi.

    Dinleyici ayarlarını ve güvenlik kimlik bilgilerini sağlamanın iki yolu vardır:

    1. Bunları doğrudan hizmet kodunda sağlayın:

      protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
      {
          FabricTransportRemotingListenerSettings  listenerSettings = new FabricTransportRemotingListenerSettings
          {
              MaxMessageSize = 10000000,
              SecurityCredentials = GetSecurityCredentials()
          };
          return new[]
          {
              new ServiceReplicaListener(
                  (context) => new FabricTransportServiceRemotingListener(context,this,listenerSettings))
          };
      }
      
      private static SecurityCredentials GetSecurityCredentials()
      {
          // Provide certificate details.
          var x509Credentials = new X509Credentials
          {
              FindType = X509FindType.FindByThumbprint,
              FindValue = "4FEF3950642138446CC364A396E1E881DB76B48C",
              StoreLocation = StoreLocation.LocalMachine,
              StoreName = "My",
              ProtectionLevel = ProtectionLevel.EncryptAndSign
          };
          x509Credentials.RemoteCommonNames.Add("ServiceFabric-Test-Cert");
          x509Credentials.RemoteCertThumbprints.Add("9FEF3950642138446CC364A396E1E881DB76B483");
          return x509Credentials;
      }
      
    2. Bunları bir yapılandırma paketi kullanarak sağlayın:

      settings.xml dosyasına adlandırılmış TransportSettings bölüm ekleyin.

      <Section Name="HelloWorldStatefulTransportSettings">
          <Parameter Name="MaxMessageSize" Value="10000000" />
          <Parameter Name="SecurityCredentialsType" Value="X509" />
          <Parameter Name="CertificateFindType" Value="FindByThumbprint" />
          <Parameter Name="CertificateFindValue" Value="4FEF3950642138446CC364A396E1E881DB76B48C" />
          <Parameter Name="CertificateRemoteThumbprints" Value="9FEF3950642138446CC364A396E1E881DB76B483" />
          <Parameter Name="CertificateStoreLocation" Value="LocalMachine" />
          <Parameter Name="CertificateStoreName" Value="My" />
          <Parameter Name="CertificateProtectionLevel" Value="EncryptAndSign" />
          <Parameter Name="CertificateRemoteCommonNames" Value="ServiceFabric-Test-Cert" />
      </Section>
      

      Bu durumda yöntemi CreateServiceReplicaListeners aşağıdaki gibi görünür:

      protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
      {
          return new[]
          {
              new ServiceReplicaListener(
                  (context) => new FabricTransportServiceRemotingListener(
                      context,this,FabricTransportRemotingListenerSettings .LoadFrom("HelloWorldStatefulTransportSettings")))
          };
      }
      

      settings.xml dosyasına FabricTransportRemotingListenerSettings bir TransportSettings bölüm eklerseniz, bu bölümdeki tüm ayarlar varsayılan olarak yüklenir.

      <!--"TransportSettings" section .-->
      <Section Name="TransportSettings">
          ...
      </Section>
      

      Bu durumda yöntemi CreateServiceReplicaListeners aşağıdaki gibi görünür:

      protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
      {
          return new[]
          {
              return new[]{
                      new ServiceReplicaListener(
                          (context) => new FabricTransportServiceRemotingListener(context,this))};
          };
      }
      
  3. Güvenli bir hizmette uzaktan iletişim yığınını kullanarak yöntemleri çağırdığınızda, hizmet ara sunucusu oluşturmak için sınıfını Microsoft.ServiceFabric.Services.Remoting.Client.ServiceProxy kullanmak yerine kullanın Microsoft.ServiceFabric.Services.Remoting.Client.ServiceProxyFactory. öğesini içeren 'yi FabricTransportRemotingSettingsgeçirin SecurityCredentials.

    
    var x509Credentials = new X509Credentials
    {
        FindType = X509FindType.FindByThumbprint,
        FindValue = "9FEF3950642138446CC364A396E1E881DB76B483",
        StoreLocation = StoreLocation.LocalMachine,
        StoreName = "My",
        ProtectionLevel = ProtectionLevel.EncryptAndSign
    };
    x509Credentials.RemoteCommonNames.Add("ServiceFabric-Test-Cert");
    x509Credentials.RemoteCertThumbprints.Add("4FEF3950642138446CC364A396E1E881DB76B48C");
    
    FabricTransportRemotingSettings transportSettings = new FabricTransportRemotingSettings
    {
        SecurityCredentials = x509Credentials,
    };
    
    ServiceProxyFactory serviceProxyFactory = new ServiceProxyFactory(
        (c) => new FabricTransportServiceRemotingClientFactory(transportSettings));
    
    IHelloWorldStateful client = serviceProxyFactory.CreateServiceProxy<IHelloWorldStateful>(
        new Uri("fabric:/MyApplication/MyHelloWorldService"));
    
    string message = await client.GetHelloWorld();
    
    

    İstemci kodu bir hizmetin parçası olarak çalışıyorsa, settings.xml dosyasından yükleyebilirsiniz FabricTransportRemotingSettings . Daha önce gösterildiği gibi hizmet koduna benzer bir HelloWorldClientTransportSettings bölümü oluşturun. İstemci kodunda aşağıdaki değişiklikleri yapın:

    ServiceProxyFactory serviceProxyFactory = new ServiceProxyFactory(
        (c) => new FabricTransportServiceRemotingClientFactory(FabricTransportRemotingSettings.LoadFrom("HelloWorldClientTransportSettings")));
    
    IHelloWorldStateful client = serviceProxyFactory.CreateServiceProxy<IHelloWorldStateful>(
        new Uri("fabric:/MyApplication/MyHelloWorldService"));
    
    string message = await client.GetHelloWorld();
    
    

    İstemci bir hizmetin parçası olarak çalışmıyorsa, client_name.exe olduğu konumda bir client_name.settings.xml dosyası oluşturabilirsiniz. Ardından bu dosyada bir TransportSettings bölümü oluşturun.

    Hizmete benzer şekilde, istemci settings.xml/client_name.settings.xml bir TransportSettings bölüm eklerseniz, FabricTransportRemotingSettings varsayılan olarak bu bölümdeki tüm ayarları yükler.

    Bu durumda, önceki kod daha da basitleştirilir:

    
    IHelloWorldStateful client = ServiceProxy.Create<IHelloWorldStateful>(
                 new Uri("fabric:/MyApplication/MyHelloWorldService"));
    
    string message = await client.GetHelloWorld();
    
    

Sonraki adım olarak Reliable Services'da OWIN ile Web API'sini okuyun.