C# hizmetinde güvenli hizmet uzaktan iletişim iletişimleri
Güvenlik, iletişimin en önemli yönlerinden biridir. Reliable Services uygulama çerçevesi, güvenliği geliştirmek için kullanabileceğiniz önceden oluşturulmuş birkaç iletişim yığını ve aracı sağlar. Bu makalede, bir C# hizmetinde hizmet uzaktan iletişimini kullanırken güvenliğin nasıl artırılacağı açıklanır. C# dilinde yazılmış güvenilir hizmetler için uzaktan iletişimin nasıl ayarlandığını açıklayan mevcut bir örnek üzerine kurulur.
C# hizmetleriyle hizmet uzaktan iletişimini kullanırken hizmetin güvenliğini sağlamaya yardımcı olmak için şu adımları izleyin:
Hizmetinizdeki bir uzak yordam çağrısı için kullanılabilecek yöntemleri tanımlayan bir arabirim
IHelloWorldStateful
oluşturun. Hizmetiniz, ad alanındaMicrosoft.ServiceFabric.Services.Remoting.FabricTransport.Runtime
bildirilen öğesini kullanırFabricTransportServiceRemotingListener
. Bu, uzaktan iletişim özellikleri sağlayan birICommunicationListener
uygulamadır.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!"); } }
Dinleyici ayarlarını ve güvenlik kimlik bilgilerini ekleyin.
Hizmet iletişiminizin güvenliğini sağlamaya yardımcı olmak için kullanmak istediğiniz sertifikanın kümedeki tüm düğümlere yüklendiğinden emin olun.
Not
Linux düğümlerinde, sertifika /var/lib/sfcerts dizininde PEM biçimli dosyalar olarak bulunmalıdır. Daha fazla bilgi edinmek için bkz . Linux düğümlerinde X.509 sertifikalarının konumu ve biçimi.
Dinleyici ayarlarını ve güvenlik kimlik bilgilerini sağlamanın iki yolu vardır:
Bunları doğrudan hizmet kodunda sağlayın:
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; }
Bunları bir yapılandırma paketi kullanarak sağlayın:
settings.xml dosyasına adlandırılmış
TransportSettings
bölüm ekleyin.<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>
Bu durumda yöntemi
CreateServiceReplicaListeners
aşağıdaki gibi görünür:protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() { return new[] { new ServiceReplicaListener( (context) => new FabricTransportServiceRemotingListener( context,this,FabricTransportRemotingListenerSettings .LoadFrom("HelloWorldStatefulTransportSettings"))) }; }
settings.xml dosyasına
FabricTransportRemotingListenerSettings
birTransportSettings
bölüm eklerseniz, bu bölümdeki tüm ayarlar varsayılan olarak yüklenir.<!--"TransportSettings" section .--> <Section Name="TransportSettings"> ... </Section>
Bu durumda yöntemi
CreateServiceReplicaListeners
aşağıdaki gibi görünür:protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() { return new[] { return new[]{ new ServiceReplicaListener( (context) => new FabricTransportServiceRemotingListener(context,this))}; }; }
Güvenli bir hizmette uzaktan iletişim yığınını kullanarak yöntemleri çağırdığınızda, hizmet ara sunucusu oluşturmak için sınıfını
Microsoft.ServiceFabric.Services.Remoting.Client.ServiceProxy
kullanmak yerine kullanınMicrosoft.ServiceFabric.Services.Remoting.Client.ServiceProxyFactory
. öğesini içeren 'yiFabricTransportRemotingSettings
geçirinSecurityCredentials
.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();
İstemci kodu bir hizmetin parçası olarak çalışıyorsa, settings.xml dosyasından yükleyebilirsiniz
FabricTransportRemotingSettings
. Daha önce gösterildiği gibi hizmet koduna benzer bir HelloWorldClientTransportSettings bölümü oluşturun. İstemci kodunda aşağıdaki değişiklikleri yapın: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();
İstemci bir hizmetin parçası olarak çalışmıyorsa, client_name.exe olduğu konumda bir client_name.settings.xml dosyası oluşturabilirsiniz. Ardından bu dosyada bir TransportSettings bölümü oluşturun.
Hizmete benzer şekilde, istemci settings.xml/client_name.settings.xml bir
TransportSettings
bölüm eklerseniz,FabricTransportRemotingSettings
varsayılan olarak bu bölümdeki tüm ayarları yükler.Bu durumda, önceki kod daha da basitleştirilir:
IHelloWorldStateful client = ServiceProxy.Create<IHelloWorldStateful>( new Uri("fabric:/MyApplication/MyHelloWorldService")); string message = await client.GetHelloWorld();
Sonraki adım olarak Reliable Services'da OWIN ile Web API'sini okuyun.