A kommunikáció biztonságossá tételének biztosítása C#-szolgáltatásban
A biztonság a kommunikáció egyik legfontosabb eleme. A Reliable Services alkalmazás-keretrendszer néhány előre összeállított kommunikációs vermet és eszközt biztosít, amelyekkel javíthatja a biztonságot. Ez a cikk azt ismerteti, hogyan javíthatja a biztonságot, ha szolgáltatásátírást használ egy C#-szolgáltatásban. Egy meglévő példára épül, amely leírja, hogyan állíthatja be a C# nyelven írt megbízható szolgáltatásokhoz való átnevezést.
A szolgáltatás C#-szolgáltatásokkal való újraindítása során a szolgáltatás biztonságossá tételéhez kövesse az alábbi lépéseket:
Hozzon létre egy felületet (),
IHelloWorldStateful
amely meghatározza a távoli eljáráshíváshoz elérhető metódusokat a szolgáltatásban. A szolgáltatás a nevet fogja használniFabricTransportServiceRemotingListener
, amely aMicrosoft.ServiceFabric.Services.Remoting.FabricTransport.Runtime
névtérben van deklarálva. Ez egyICommunicationListener
olyan implementáció, amely újraegyeztetési képességeket biztosít.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!"); } }
Adjon hozzá figyelőbeállításokat és biztonsági hitelesítő adatokat.
Győződjön meg arról, hogy a szolgáltatás kommunikációjának biztonságossá tételéhez használni kívánt tanúsítvány telepítve van a fürt összes csomópontján.
Megjegyzés
Linux-csomópontokon a tanúsítványnak PEM formátumú fájlként kell szerepelnie a /var/lib/sfcerts könyvtárban. További információ: Az X.509-tanúsítványok helye és formátuma Linux-csomópontokon.
Kétféleképpen adhatja meg a figyelő beállításait és a biztonsági hitelesítő adatokat:
Adja meg őket közvetlenül a szolgáltatáskódban:
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; }
Adja meg őket egy konfigurációs csomag használatával:
Adjon hozzá egy elnevezett
TransportSettings
szakaszt a settings.xml fájlhoz.<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>
Ebben az esetben a metódus a
CreateServiceReplicaListeners
következőképpen fog kinézni:protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() { return new[] { new ServiceReplicaListener( (context) => new FabricTransportServiceRemotingListener( context,this,FabricTransportRemotingListenerSettings .LoadFrom("HelloWorldStatefulTransportSettings"))) }; }
Ha hozzáad egy szakaszt
TransportSettings
a settings.xml fájlhoz,FabricTransportRemotingListenerSettings
alapértelmezés szerint betölti a szakasz összes beállítását.<!--"TransportSettings" section .--> <Section Name="TransportSettings"> ... </Section>
Ebben az esetben a metódus a
CreateServiceReplicaListeners
következőképpen fog kinézni:protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() { return new[] { return new[]{ new ServiceReplicaListener( (context) => new FabricTransportServiceRemotingListener(context,this))}; }; }
Ha metódusokat hív meg egy biztonságos szolgáltatáson a visszahívási verem használatával, ahelyett, hogy a osztályt használva hoz létre szolgáltatásproxyt, használja a
Microsoft.ServiceFabric.Services.Remoting.Client.ServiceProxy
parancsotMicrosoft.ServiceFabric.Services.Remoting.Client.ServiceProxyFactory
. Adja meg a következőt:FabricTransportRemotingSettings
, amely tartalmazza a következőtSecurityCredentials
: .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();
Ha az ügyfélkód egy szolgáltatás részeként fut, az settings.xml fájlból tölthető be
FabricTransportRemotingSettings
. Hozzon létre egy, a szolgáltatáskódhoz hasonló HelloWorldClientTransportSettings szakaszt, ahogy azt korábban is láthattuk. Végezze el a következő módosításokat az ügyfélkódon: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();
Ha az ügyfél nem egy szolgáltatás részeként fut, létrehozhat egy client_name.settings.xml fájlt ugyanazon a helyen, ahol a client_name.exe található. Ezután hozzon létre egy TransportSettings szakaszt a fájlban.
A szolgáltatáshoz hasonlóan, ha hozzáad egy szakaszt
TransportSettings
az ügyfél settings.xml/client_name.settings.xml,FabricTransportRemotingSettings
alapértelmezés szerint betölti a szakasz összes beállítását.Ebben az esetben a korábbi kód még egyszerűbb:
IHelloWorldStateful client = ServiceProxy.Create<IHelloWorldStateful>( new Uri("fabric:/MyApplication/MyHelloWorldService")); string message = await client.GetHelloWorld();
Következő lépésként olvassa el a Web API és az OWIN együttes használatát a Reliable Servicesben.