Communicatie via externe communicatie van services beveiligen in een C#-service

Beveiliging is een van de belangrijkste aspecten van communicatie. Het Reliable Services-toepassingsframework biedt enkele vooraf samengestelde communicatiestacks en hulpprogramma's die u kunt gebruiken om de beveiliging te verbeteren. In dit artikel wordt beschreven hoe u de beveiliging kunt verbeteren wanneer u externe communicatie gebruikt in een C#-service. Het bouwt voort op een bestaand voorbeeld waarin wordt uitgelegd hoe u externe toegang instelt voor betrouwbare services die zijn geschreven in C#.

Voer de volgende stappen uit om een service te beveiligen wanneer u externe communicatie met C#-services gebruikt:

  1. Maak een interface, IHelloWorldStateful, die de methoden definieert die beschikbaar zijn voor een externe procedureaanroep op uw service. Uw service gebruikt FabricTransportServiceRemotingListener, dat is gedeclareerd in de Microsoft.ServiceFabric.Services.Remoting.FabricTransport.Runtime naamruimte. Dit is een ICommunicationListener implementatie die externe communicatiemogelijkheden biedt.

    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. Listener-instellingen en beveiligingsreferenties toevoegen.

    Zorg ervoor dat het certificaat dat u wilt gebruiken om uw servicecommunicatie te beveiligen, is geïnstalleerd op alle knooppunten in het cluster.

    Notitie

    Op Linux-knooppunten moet het certificaat aanwezig zijn als bestanden met PEM-indeling in de map /var/lib/sfcerts . Zie Locatie en indeling van X.509-certificaten op Linux-knooppunten voor meer informatie.

    Er zijn twee manieren waarop u listener-instellingen en beveiligingsreferenties kunt opgeven:

    1. Geef deze rechtstreeks in de servicecode op:

      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. Geef ze op met behulp van een configuratiepakket:

      Voeg een benoemde TransportSettings sectie toe aan het settings.xml-bestand.

      <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>
      

      In dit geval ziet de CreateServiceReplicaListeners methode er als volgt uit:

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

      Als u een TransportSettings sectie toevoegt aan het settings.xml-bestand , FabricTransportRemotingListenerSettings worden standaard alle instellingen uit deze sectie geladen.

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

      In dit geval ziet de CreateServiceReplicaListeners methode er als volgt uit:

      protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
      {
          return new[]
          {
              return new[]{
                      new ServiceReplicaListener(
                          (context) => new FabricTransportServiceRemotingListener(context,this))};
          };
      }
      
  3. Wanneer u methoden op een beveiligde service aanroept met behulp van de externe stack, gebruikt u in plaats van de Microsoft.ServiceFabric.Services.Remoting.Client.ServiceProxy klasse om een serviceproxy te maken.Microsoft.ServiceFabric.Services.Remoting.Client.ServiceProxyFactory Geef door in FabricTransportRemotingSettings, dat bevat 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();
    
    

    Als de clientcode wordt uitgevoerd als onderdeel van een service, kunt u laden FabricTransportRemotingSettings vanuit het settings.xml-bestand. Maak een sectie HelloWorldClientTransportSettings die vergelijkbaar is met de servicecode, zoals eerder is weergegeven. Breng de volgende wijzigingen aan in de clientcode:

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

    Als de client niet wordt uitgevoerd als onderdeel van een service, kunt u een client_name.settings.xml-bestand maken op dezelfde locatie als waar het client_name.exe zich bevindt. Maak vervolgens een sectie TransportSettings in dat bestand.

    Net als bij de service, als u een TransportSettings sectie toevoegt in client settings.xml/client_name.settings.xml, FabricTransportRemotingSettings worden standaard alle instellingen uit deze sectie geladen.

    In dat geval wordt de eerdere code nog verder vereenvoudigd:

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

Als volgende stap leest u Web-API met OWIN in Reliable Services.