A kommunikáció biztonságossá tételének biztosítása C#-szolgáltatásban
A biztonság a kommunikáció egyik legfontosabb aspektusa. A Reliable Services alkalmazás keretrendszere 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 bemutatja, hogyan állíthat be újraírást a C#-ban írt megbízható szolgáltatásokhoz.
A szolgáltatás C#-szolgáltatásokkal való újraírá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 névtérbenMicrosoft.ServiceFabric.Services.Remoting.FabricTransport.Runtime
deklarált nevet fogja használniFabricTransportServiceRemotingListener
. 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.
Feljegyzé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ó: X.509-tanúsítványok helye és formátuma Linux-csomópontokon.
Kétféleképpen adhat meg figyelőbeállításokat és 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ájlban.<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 az újraegyeztetési verem használatával, ahelyett, hogy az osztályt használva hoz létre szolgáltatásproxyt, használja a
Microsoft.ServiceFabric.Services.Remoting.Client.ServiceProxy
következőtMicrosoft.ServiceFabric.Services.Remoting.Client.ServiceProxyFactory
: . Adja meg aFabricTransportRemotingSettings
elemet, 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, betöltheti
FabricTransportRemotingSettings
a settings.xml fájlból. Hozzon létre egy, a szolgáltatáskódhoz hasonló HelloWorldClientTransportSettings szakaszt, ahogyan 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-t az OWIN használatával a Reliable Servicesben.