Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Säkerhet är en av de viktigaste aspekterna av kommunikation. Reliable Services-programramverket innehåller några fördefinierade kommunikationsstackar och verktyg som du kan använda för att förbättra säkerheten. I den här artikeln beskrivs hur du kan förbättra säkerheten när du använder tjänstmoting i en C#-tjänst. Den bygger på ett befintligt exempel som förklarar hur du konfigurerar fjärrkommunikation för tillförlitliga tjänster som skrivits i C#.
För att hjälpa till att säkerställa en tjänst när du använder fjärranrop med C#-tjänster, följ dessa steg:
Skapa ett gränssnitt,
IHelloWorldStateful
, som definierar de metoder som ska vara tillgängliga för ett fjärrproceduranrop i tjänsten. Tjänsten använderFabricTransportServiceRemotingListener
, som deklareras iMicrosoft.ServiceFabric.Services.Remoting.FabricTransport.Runtime
namnområdet. Det här är enICommunicationListener
implementering som tillhandahåller fjärrfunktioner.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!"); } }
Lägg till lyssnarinställningar och säkerhetsautentiseringsuppgifter.
Kontrollera att certifikatet som du vill använda för att skydda tjänstkommunikationen är installerat på alla noder i klustret.
Anmärkning
På Linux-noder måste certifikatet finnas som PEM-formaterade filer i katalogen /var/lib/sfcerts . Mer information finns i Plats och format för X.509-certifikat på Linux-noder.
Du kan ange lyssningsinställningar och säkerhetsautentiseringsuppgifter på två sätt:
Ange dem direkt i tjänstkoden:
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 = "BB22CC33DD44EE55FF66AA77BB88CC99DD00EE11", StoreLocation = StoreLocation.LocalMachine, StoreName = "My", ProtectionLevel = ProtectionLevel.EncryptAndSign }; x509Credentials.RemoteCommonNames.Add("ServiceFabric-Test-Cert"); x509Credentials.RemoteCertThumbprints.Add("AA11BB22CC33DD44EE55FF66AA77BB88CC99DD00"); return x509Credentials; }
Ange dem med hjälp av ett konfigurationspaket:
Lägg till ett namngivet
TransportSettings
avsnitt i filen settings.xml.<Section Name="HelloWorldStatefulTransportSettings"> <Parameter Name="MaxMessageSize" Value="10000000" /> <Parameter Name="SecurityCredentialsType" Value="X509" /> <Parameter Name="CertificateFindType" Value="FindByThumbprint" /> <Parameter Name="CertificateFindValue" Value="BB22CC33DD44EE55FF66AA77BB88CC99DD00EE11" /> <Parameter Name="CertificateRemoteThumbprints" Value="AA11BB22CC33DD44EE55FF66AA77BB88CC99DD00" /> <Parameter Name="CertificateStoreLocation" Value="LocalMachine" /> <Parameter Name="CertificateStoreName" Value="My" /> <Parameter Name="CertificateProtectionLevel" Value="EncryptAndSign" /> <Parameter Name="CertificateRemoteCommonNames" Value="ServiceFabric-Test-Cert" /> </Section>
I det här fallet
CreateServiceReplicaListeners
ser metoden ut så här:protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() { return new[] { new ServiceReplicaListener( (context) => new FabricTransportServiceRemotingListener( context,this,FabricTransportRemotingListenerSettings .LoadFrom("HelloWorldStatefulTransportSettings"))) }; }
Om du lägger till ett
TransportSettings
avsnitt i filen settings.xml läserFabricTransportRemotingListenerSettings
du in alla inställningar från det här avsnittet som standard.<!--"TransportSettings" section .--> <Section Name="TransportSettings"> ... </Section>
I det här fallet
CreateServiceReplicaListeners
ser metoden ut så här:protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() { return new[] { return new[]{ new ServiceReplicaListener( (context) => new FabricTransportServiceRemotingListener(context,this))}; }; }
När du anropar metoder på en säker tjänst med hjälp av fjärrkommunikationsstacken, använd
Microsoft.ServiceFabric.Services.Remoting.Client.ServiceProxy
istället för att användaMicrosoft.ServiceFabric.Services.Remoting.Client.ServiceProxyFactory
-klassen för att skapa en tjänstproxy. Skicka inFabricTransportRemotingSettings
, som innehållerSecurityCredentials
.var x509Credentials = new X509Credentials { FindType = X509FindType.FindByThumbprint, FindValue = "AA11BB22CC33DD44EE55FF66AA77BB88CC99DD00", StoreLocation = StoreLocation.LocalMachine, StoreName = "My", ProtectionLevel = ProtectionLevel.EncryptAndSign }; x509Credentials.RemoteCommonNames.Add("ServiceFabric-Test-Cert"); x509Credentials.RemoteCertThumbprints.Add("BB22CC33DD44EE55FF66AA77BB88CC99DD00EE11"); 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();
Om klientkoden körs som en del av en tjänst kan du läsa in
FabricTransportRemotingSettings
från settings.xml-filen. Skapa ett HelloWorldClientTransportSettings-avsnitt som liknar tjänstkoden, som visat tidigare. Gör följande ändringar i klientkoden: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();
Om klienten inte körs som en del av en tjänst kan du skapa en client_name.settings.xml fil på samma plats där client_name.exe finns. Skapa sedan ett TransportSettings-avsnitt i filen.
På samma sätt som tjänsten, om du lägger till ett
TransportSettings
avsnitt i klient settings.xml/client_name.settings.xml, läserFabricTransportRemotingSettings
in alla inställningar från detta avsnitt som standard.I så fall förenklas den tidigare koden ytterligare:
IHelloWorldStateful client = ServiceProxy.Create<IHelloWorldStateful>( new Uri("fabric:/MyApplication/MyHelloWorldService")); string message = await client.GetHelloWorld();
Som ett nästa steg läser du Webb-API med OWIN i Reliable Services.