Communicatie tussen externe services in een C#-service beveiligen
Beveiliging is een van de belangrijkste aspecten van communicatie. Het Reliable Services-toepassingsframework biedt enkele vooraf gemaakte 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 services 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 services voor services van services gebruikt:
Maak een interface,
IHelloWorldStateful
waarmee de methoden worden gedefinieerd die beschikbaar zijn voor een externe procedureaanroep op uw service. Uw service gebruiktFabricTransportServiceRemotingListener
, die wordt gedeclareerd in deMicrosoft.ServiceFabric.Services.Remoting.FabricTransport.Runtime
naamruimte. Dit is eenICommunicationListener
implementatie die externe mogelijkheden 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!"); } }
Voeg listenerinstellingen en beveiligingsreferenties toe.
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 PEM-bestanden 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 listenerinstellingen en beveiligingsreferenties kunt opgeven:
Geef ze rechtstreeks op in de servicecode:
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; }
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 in het settings.xml-bestand toevoegt,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))}; }; }
Wanneer u methoden aanroept voor een beveiligde service met behulp van de externe stack, in plaats van de
Microsoft.ServiceFabric.Services.Remoting.Client.ServiceProxy
klasse te gebruiken om een serviceproxy te maken, gebruikt uMicrosoft.ServiceFabric.Services.Remoting.Client.ServiceProxyFactory
.FabricTransportRemotingSettings
Doorgeven , dat bevatSecurityCredentials
.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 wordt 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 waar de client_name.exe zich bevindt. Maak vervolgens een sectie TransportSettings in dat bestand.
Als u een
TransportSettings
sectie toevoegt in client-settings.xml/client_name.settings.xml, worden alle instellingen van deze sectie standaard geladen,FabricTransportRemotingSettings
net als bij de service.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();
Lees als volgende stap web-API met OWIN in Reliable Services.