Mengamankan komunikasi layanan jarak jauh pada layanan C#
Keamanan adalah salah satu aspek terpenting dalam komunikasi. Kerangka kerja aplikasi Layanan Andal menyediakan beberapa tumpukan dan alat komunikasi bawaan yang dapat digunakan untuk meningkatkan keamanan. Artikel ini membahas cara meningkatkan keamanan saat Anda menggunakan jarak jauh layanan di layanan C#. Ini dibangun berdasarkan contoh yang sudah ada yang menjelaskan cara menyiapkan jarak jauh untuk layanan andal yang ditulis dalam C#.
Untuk membantu mengamankan layanan saat Anda menggunakan jarak jauh layanan dengan layanan C#, ikuti langkah-langkah berikut:
Buat antarmuka,
IHelloWorldStateful
, yang menentukan metode yang akan tersedia untuk panggilan prosedur jarak jauh pada layanan Anda. Layanan Anda akan menggunakanFabricTransportServiceRemotingListener
, yang dinyatakan dalam namespaceMicrosoft.ServiceFabric.Services.Remoting.FabricTransport.Runtime
. Ini adalah implementasiICommunicationListener
yang memberikan kemampuan jarak jauh.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!"); } }
Tambahkan pengaturan pendengar dan mandat keamanan.
Pastikan sertifikat yang ingin Anda gunakan untuk membantu mengamankan komunikasi layanan Anda diinstal pada semua node di kluster.
Catatan
Pada node Linux, sertifikat harus hadir sebagai file dengan format dalam direktori /var/lib/sfcerts. Untuk mempelajari lebih lanjut, lihat Lokasi dan format sertifikat X.509 pada node Linux.
Ada dua cara untuk menyediakan pengaturan pendengar dan mandat keamanan:
Berikan mereka langsung dalam kode layanan:
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; }
Sediakan menggunakan paket konfigurasi:
Tambahkan bagian bernama
TransportSettings
dalam file settings.xml.<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>
Dalam hal ini, metode
CreateServiceReplicaListeners
akan terlihat seperti ini:protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() { return new[] { new ServiceReplicaListener( (context) => new FabricTransportServiceRemotingListener( context,this,FabricTransportRemotingListenerSettings .LoadFrom("HelloWorldStatefulTransportSettings"))) }; }
Jika Anda menambahkan bagian
TransportSettings
dalam file settings.xml,FabricTransportRemotingListenerSettings
akan membuat semua pengaturan dari bagian ini secara default.<!--"TransportSettings" section .--> <Section Name="TransportSettings"> ... </Section>
Dalam hal ini, metode
CreateServiceReplicaListeners
akan terlihat seperti ini:protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() { return new[] { return new[]{ new ServiceReplicaListener( (context) => new FabricTransportServiceRemotingListener(context,this))}; }; }
Anda bisa memanggil metode pada layanan aman menggunakan tumpukan jarak jauh, alih-alih menggunakan kelas
Microsoft.ServiceFabric.Services.Remoting.Client.ServiceProxy
untuk membuat proksi layanan, menggunakanMicrosoft.ServiceFabric.Services.Remoting.Client.ServiceProxyFactory
. Lolos dalamFabricTransportRemotingSettings
, yang berisiSecurityCredentials
.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();
Jika kode klien berjalan sebagai bagian dari layanan, Anda dapat memuat
FabricTransportRemotingSettings
dari file settings.xml. Buat bagian HelloWorldClientTransportSettings yang sama dengan kode layanan, sebagaimana ditampilkan sebelumnya. Lakukan perubahan berikut ini pada kode klien: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();
Jika klien tidak berjalan sebagai bagian dari layanan, Anda dapat membuat file client_name.settings.xml pada lokasi yang sama dengan client_name.exe berada. Kemudian, tambahkan bagian TransportSettings dalam file tersebut.
Mirip dengan layanan, jika Anda menambahkan bagian
TransportSettings
dalam klien settings.xml/client_name.settings.xml,FabricTransportRemotingSettings
memuat semua pengaturan dari bagian ini secara default.Dalam hal ini, kode sebelumnya bahkan disederhanakan lebih lanjut:
IHelloWorldStateful client = ServiceProxy.Create<IHelloWorldStateful>( new Uri("fabric:/MyApplication/MyHelloWorldService")); string message = await client.GetHelloWorld();
Langkah selanjutnya, baca Web API dengan OWIN di Reliable Services.