اتصالات خدمة الاتصال عن بُعد الآمنة في خدمة C#
الأمان هو أحد أهم جوانب الاتصال. يوفر إطار عمل تطبيق الخدمات الموثوقة عددًا قليلاً من مكدسات الذاكرة المؤقتة وأدوات الاتصال المنشأة مسبقًا والتي يمكنك استخدامها لتحسين الأمان. تتناول هذه المقالة طريقة تحسين الأمان عند استخدام خدمة الاتصال عن بعد في خدمة C#. إنها تعتمد على مثال يشرح كيفية إعداد الاتصال عن بعد للخدمات الموثوقة المكتوبة في C#.
للمساعدة في تأمين خدمة عند استخدام خدمة الاتصال عن بعد مع خدمات C#، اتبع الخطوات التالية:
أنشئ واجهة،
IHelloWorldStateful، تحدد الطرق التي ستكون متاحة لاستدعاء إجراء عن بعد على خدمتك. ستستخدم خدمتكFabricTransportServiceRemotingListener، والتي يتم الإعلان عنها فيMicrosoft.ServiceFabric.Services.Remoting.FabricTransport.Runtimeمساحة الاسم. وذلكICommunicationListenerتنفيذ يوفّر قدرات الاتصال عن بُعد.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 = "4FEF3950642138446CC364A396E1E881DB76B48C", StoreLocation = StoreLocation.LocalMachine, StoreName = "My", ProtectionLevel = ProtectionLevel.EncryptAndSign }; x509Credentials.RemoteCommonNames.Add("ServiceFabric-Test-Cert"); x509Credentials.RemoteCertThumbprints.Add("9FEF3950642138446CC364A396E1E881DB76B483"); 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="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>في هذه الحالة،
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))}; }; }
عند استدعاء أساليب على خدمة آمنة باستخدام مكدس ذاكرة مؤقتة للاتصال عن بعد، بدلا من استخدام
Microsoft.ServiceFabric.Services.Remoting.Client.ServiceProxyالفئة لإنشاء وكيل خدمة، استخدمMicrosoft.ServiceFabric.Services.Remoting.Client.ServiceProxyFactory. مرر فيFabricTransportRemotingSettings، والذي يحتوي علىSecurityCredentials.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();إذا كانت التعليمة البرمجية للعميل قيد التشغيل كجزء من خدمة، يمكنك التحميل
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 في هذا الملف.
على غرار الخدمة، إذا قمت بإضافة
TransportSettingsقسم في settings.xml/client_name.settings.xml للعميل، فحملFabricTransportRemotingSettingsجميع الإعدادات من هذا القسم بشكل افتراضي.تُبسط التعليمة البرمجية السابقة في هذه الحالة بشكل أكبر:
IHelloWorldStateful client = ServiceProxy.Create<IHelloWorldStateful>( new Uri("fabric:/MyApplication/MyHelloWorldService")); string message = await client.GetHelloWorld();
كخطوة قادمة، اقرأ واجهة برمجة تطبيقات الويب مع OWIN في خدمات موثوقة.