Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Безопасность является одним из наиболее важных аспектов взаимодействия. Платформа приложений Reliable Services предоставляет несколько готовых стеков взаимодействия и средств, которыми можно воспользоваться для повышения безопасности. This article discusses how to improve security when you're using service remoting in a C# service. Он основан на существующем примере , который объясняет, как настроить удаленное взаимодействие для надежных служб, написанных на C#.
To help secure a service when you're using service remoting with C# services, follow these steps:
Создайте интерфейс
IHelloWorldStateful, определяющий методы, доступные для удаленного вызова процедур в вашей службе. Your service will useFabricTransportServiceRemotingListener, which is declared in theMicrosoft.ServiceFabric.Services.Remoting.FabricTransport.Runtimenamespace. This is anICommunicationListenerimplementation that provides remoting capabilities.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!"); } }Добавьте параметры прослушивателя и учетные данные безопасности.
Убедитесь, что сертификат, который вы хотите использовать для защиты связи со службой, установлен на всех узлах в кластере.
Примечание.
На узлах Linux сертификат должен присутствовать в виде файлов с форматом PEM в каталоге /var/lib/sfcerts . Дополнительные сведения см. в разделе "Расположение и формат сертификатов X.509" на узлах Linux.
Существует два способа предоставления параметров прослушивателя и учетных данных безопасности.
Укажите их непосредственно в коде службы:
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; }Предоставьте их с помощью пакета конфигурации:
Добавьте именованный
TransportSettingsраздел в файл 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>В этом случае
CreateServiceReplicaListenersметод будет выглядеть следующим образом:protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() { return new[] { new ServiceReplicaListener( (context) => new FabricTransportServiceRemotingListener( context,this,FabricTransportRemotingListenerSettings .LoadFrom("HelloWorldStatefulTransportSettings"))) }; }Если вы добавите
TransportSettingsраздел в файл settings.xml,FabricTransportRemotingListenerSettingsпо умолчанию загрузит все параметры из этого раздела.<!--"TransportSettings" section .--> <Section Name="TransportSettings"> ... </Section>В этом случае
CreateServiceReplicaListenersметод будет выглядеть следующим образом:protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() { return new[] { return new[]{ new ServiceReplicaListener( (context) => new FabricTransportServiceRemotingListener(context,this))}; }; }
When you call methods on a secured service by using the remoting stack, instead of using the
Microsoft.ServiceFabric.Services.Remoting.Client.ServiceProxyclass to create a service proxy, useMicrosoft.ServiceFabric.Services.Remoting.Client.ServiceProxyFactory. Pass inFabricTransportRemotingSettings, which containsSecurityCredentials.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();Если клиентский код выполняется как часть службы, можно загрузить
FabricTransportRemotingSettingsиз файла settings.xml. Создайте раздел HelloWorldClientTransportSettings, аналогичный коду службы, как показано ранее. Внесите следующие изменения в код клиента: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();Если клиент не работает в рамках службы, можно создать файл client_name.settings.xml в том же расположении, где находится client_name.exe. Затем создайте раздел TransportSettings в этом файле.
Similar to the service, if you add a
TransportSettingssection in client settings.xml/client_name.settings.xml,FabricTransportRemotingSettingsloads all the settings from this section by default.В этом случае более ранний код еще более упрощен:
IHelloWorldStateful client = ServiceProxy.Create<IHelloWorldStateful>( new Uri("fabric:/MyApplication/MyHelloWorldService")); string message = await client.GetHelloWorld();
As a next step, read Web API with OWIN in Reliable Services.