مشكلة مثيرة للاهتمام مع WCF wsHttpBinding من خلال جدار الحماية

StackOverflow https://stackoverflow.com/questions/361049

سؤال

لدي تطبيق ويب تم نشره في مزود استضافة الإنترنت.يستهلك تطبيق الويب هذا خدمة WCF المنتشرة على خادم IIS الموجود على خادم التطبيقات الخاص بشركتي، ومن أجل الوصول إلى البيانات إلى قاعدة بيانات الشركة، سمح لي رجال الشبكة بكشف خدمة WCF هذه من خلال جدار الحماية لأسباب أمنية.سيبدو الرسم التخطيطي هكذا.

[الصفحة المستضافة] ---> (الإنترنت) ---> |جدار الحماية <Public IP>:<Port-X >| ---> [IIS مع خدمة WCF <Comp. Network Ip>:<Port-Y>]

أردت أيضًا استخدام wsHttpBinding للاستفادة من ميزات الأمان وتشفير المعلومات الحساسة.

بعد تجربته يظهر لي الخطأ التالي:

تفاصيل الاستثناء:System.ServiceModel.EndpointNotFoundException:لا يمكن معالجة الرسالة مع "http: //: /service/wcfservice.svc" في المتلقي ، بسبب عدم تطابق addressfilter في EndpointDispatcher.تأكد من أن المرسل والمستقبل EndpointDresses يتفق.

من خلال إجراء بعض الأبحاث، اكتشفت أن wsHttpBinding يستخدم معايير WS-Addressing، وعندما قرأت عن هذا المعيار، تعلمت أن رأس SOAP محسّن ليشمل علامات مثل "MessageID" و"ReplyTo" و"Action" و"To".

لذلك أعتقد أنه نظرًا لأن نقطة نهاية تطبيق العميل تحدد عنوان IP لجدار الحماية والمنفذ، وترد الخدمة بعنوان الشبكة الداخلية الخاص بها والذي يختلف عن عنوان IP الخاص بجدار الحماية، فإن WS-Addressing يطلق الرسالة أعلاه.وأعتقد أنه إجراء أمني جيد جدًا، لكنه ليس مفيدًا تمامًا في السيناريو الخاص بي.

نقلاً عن الإرسال القياسي WS-Addressing (http://www.w3.org/Submission/ws-addressing/)

"نظرًا لنطاق تقنيات الشبكة التي تستخدم حاليًا استخدامًا واسع النطاق (على سبيل المثال ، NAT ، DHCP ، جدران الحماية) ، لا يمكن للعديد من عمليات النشر تعيين URI عالمية ذات معنى إلى نقطة نهاية معينة.للسماح بنقاط النهاية "المجهولة" ببدء أنماط تبادل الرسائل وتلقي الردود ، يحدد WS-Addressing URI المعروف التالي لاستخدامه بواسطة نقاط النهاية التي لا يمكن أن تحتوي على URI مستقرة وقابلة للحل. http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous"

كيف يمكنني تكوين نقطة نهاية wsHttpBinding الخاصة بي لمعالجة عنوان IP الخاص بجدار الحماية الخاص بي وتجاهل أو تجاوز العنوان المحدد في علامة WS-Addressing "إلى" في رأس رسالة SOAP؟أو هل يجب علي تغيير شيء ما في تكوين نقطة نهاية الخدمة الخاصة بي؟

المساعدة والتوجيه سيكون موضع تقدير كبير.

ماركو.

ملاحظة.:بينما أجد أي حل لهذا، فأنا أستخدم basicHttpBinding دون أي مشكلة على الإطلاق بالطبع.

هل كانت مفيدة؟

المحلول

يمكنك محاولة تزيين فئة الخدمة الخاصة بك بما يلي:

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

نصائح أخرى

الطريقة الأكثر أمانًا للتعامل مع ذلك هي تعيين نقطة النهاية ListUri على عنوان URL للخدمة، وعنوان نقطة النهاية على نقطة النهاية الخارجية حيث يرسل العملاء الرسائل.بهذه الطريقة، "تثق" الخدمة في الرسائل الموجهة فقط إلى هذا العنوان، وليس فقط أي عنوان.

لا أعرف عن الحل من ميتش بيكر، ولم أجربه مطلقًا.ولكن هذا ينطوي على تعديل التعليمات البرمجية التي تم إنشاؤها.هناك طريقة أخرى للالتفاف على ذلك.

أفترض أنك قمت بإنشاء رمز العميل باستخدام svcutil.exe، مع إعطاء عنوان MEX يشير إلى جدار الحماية.عند القيام بذلك، تتم إضافة كافة التكوينات المطلوبة إلى App.config (أو Web.config).ومع ذلك، فإن عنوان الخدمة في التكوين سيشير إلى عنوان الخدمة الحقيقي (كما هو الحال في ملف WSDL، يظل عنوان الخدمة هو عنوان الخدمة الحقيقي).

إذن ما أعتقد أنه سيحل هذه المشكلة:

  1. قم بإنشاء رمز العميل عن طريق إعطاء عنوان MEX (على سبيل المثال:http://:Port-X/service/wcfservice.svc?wsdl).سيؤدي هذا إلى إنشاء كافة التكوينات المطلوبة.

  2. عند استدعاء مُنشئ العميل، قم بإعطاء URI الخاص بجدار الحماية كـ EnpointAddress، واسم التكوين الخاص بالتكوين الذي تم إنشاؤه.بهذه الطريقة، سيرسل العميل رسالة كما لو كان يرسلها إلى الخدمة، ولكن إلى عنوان جدار الحماية:

    Client = new ServiceClient(endpointConfigName, new System.ServiceModel.EndpointAddress("http://:Port-X/service/wcfservice.svc"));

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top