عنوان:

‫روش از کار انداختن صفحه‌ی Add service reference در VS.NET


نویسنده: وحید نصیری
تاریخ: ۱۳۹۰/۰۱/۲۸ ۱۷:۰۹:۰۰
آدرس: www.dntips.ir

در جهت تکمیل بحث "بررسی امنیتی، حین استفاده از jQuery Ajax"، یک مورد دیگر را هم می‌توان اضافه کرد: چگونه صفحه‌ی معروف Add service reference را در VS.NET جهت سرویس WCF خود از کار بیندازیم؟
راه حل آن هم بسیار ساده است اما چون عموما در منابع مرتبط با جملات و کلمات بیش از حد فنی بیان می‌شود، شاید از دید دور مانده باشد:
اگر WCF Service تولیدی شما تنها قرار است توسط برنامه‌ی Silverlight یا جاوا اسکریپتی موجود در پروژه‌ی جاری مورد استفاده قرار گیرد، باید Meta Data مرتبط با آن سرویس را جهت بالابردن امنیت سیستم، حذف نمود. توسط این Meta Data می‌توان ServiceContract ، OperationContract و سایر اطلاعات یک WCF Service را استخراج نمود.

الف) روش غیر فعال کردن متادیتا در یک Ajax enabled WCF Service

به فایل وب کانفیگ برنامه مراجعه کرده و تغییر زیر را اعمال کنید:
...
<behavior name="">
<serviceMetadata httpGetEnabled="false" httpsGetUrl="false" />
...
</behavior>
...

ب) روش غیرفعال کردن متادیتا در یک Silverlight enabled WCF Service

ابتدا قسمت الف را اعمال نموده سپس تغییر زیر را نیز لحاظ نمائید (IMetadataExchange به صورت کامنت درآمده):
<!-- <endpoint address="mex" binding="mexHttpBinding"
contract="IMetadataExchange" /> -->

با این تغییرات ساده، گزینه‌ی Add service reference دیگر قابلیت تشخیص خودکار اطلاعات سرویس شما را نداشته و با یک خطا متوقف خواهد شد:
The HTML document does not contain Web service discovery information.
Metadata contains a reference that cannot be resolved.

سؤال:
1- آیا با این تغییر در عملکرد WCF سرویس ما اخلال ایجاد خواهد شد؟
پاسخ: خیر. تنها Web service discovery information را از کار انداخته‌ایم.
2- در صورت تغییر کدهای WCF Service چه باید کرد؟
پاسخ: اگر امضای متدها و اینترفیس‌های تعریف شده تغییری نداشته‌اند، لزومی به هیچ نوع تغییری نیست. در غیراینصورت، سریع موارد الف و ب فوق را به حالت اول برگردانده، کلاینت مورد استفاده را به روز کنید، مجددا متادیتا را حذف نمائید.

نظرات

  • مهمان در ۱۳۹۰/۰۱/۲۸ ۲۳:۳۸:۱۲
    با درود و خسته نباشید
    استاد گرامی پرسشی داشتم
    ما در سازمانمان نرم افزاری داریم که کاربران آن در Active directory تعریف شده اند.
    برنامه با وب سرویس در ارتباط است که در یک سروری قرار گرفته است که آن سرور با یک سرور دیگر از طریق کابل شبکه در ارتباط است.
    سرور دوم سروری است که پایگاه داده روی آن قرار گرفته است.
    با توجه به اینکه با WCF کاربر جاری برنامه را می توان به دست آورد؛ ما کاربر جاری را تا سطح سرور 1 می آوریم ولی برای ارسال آن به اس کیو ال دو راه حل داریم.
    راهی که هم اکنون از آن استفاده می کنیم این است که Connection string مان تک کاربره است و دیگر اینکه هم اکنون که کاربر جاری را داریم همان را با Connection string به سمت SQL بفرستیم و که در نتیجه گزارش گیری و مانیتورینگ بسیار خوبی خواهیم داشت. ولی باید همه کاربران در SQL تعریف شوند چون سرور پایگاه داده به دومین متصل نیست.

    به نظر شما در صورتی که سرورهای نسبتاً خوبی از لحاظ سخت افزاری داشته باشیم و کاربرانی در حدود 2000 نفر به طور کلی و 200 نفر همزمان داشته باشیم، Connection string تک کاربره بهتر است یا چند کاربره؟

    با سپاس فراوان
  • وحید نصیری در ۱۳۹۰/۰۱/۲۹ ۰۰:۴۱:۵۴
    سلام
    سوال شما مرتبط با بحث نیست (و مطابق معمول این موارد رو من حذف می‌کنم) ... فقط در حالت کلی این موارد را باید در نظر داشت:
    استفاده از کاربران اکتیودایرکتوری به همراه برنامه‌های وب به شدت مشکل ساز است از این لحاظ که هر کاربر در اکتیو دایرکتوری با یک SID مشخص می‌شود و این SID تا زمانیکه کاربر تغییری نداشته (مثلا سرور کرش کرده، دوباره نصب شده یا کاربر حذف شده دوباره اضافه شده) معتبر است و در غیر اینصورت هرچند نام جدید با نام قبلی یکی است اما چون این SID یکی نیست، در برنامه دیگر شناسایی نخواهد شد (مشکل شایع کاربران شیرپوینت برای مثال). به عبارتی سیستم‌های تحت وب متکی بر تعیین اعتبار اکتیودایرکتوری تا زمانیکه کاربران آن حذف نشده‌اند ... خوب کار می‌کنند، اما، امان از روزی که مجبور به تعریف مجدد شوید. اینجا است که هیچ چیزی کار نمی‌کند (چون اکتیودایرکتوری فقط SID را می‌شناسد و نه اسم که فقط ظاهر کار است).
    به همین جهت روش امنیتی Forms Authentication که قسمتی از آن تعریف کاربران در بانک اطلاعاتی است در دراز مدت برای شما مقرون به صرفه‌تر خواهد بود.
  • مهمان در ۱۳۹۰/۰۱/۳۱ ۰۱:۱۶:۳۶
    سلام آقای نصیری
    لطفا در مورد polling duplex هم توضیح دهید

    ممنون میشم
  • وحید نصیری در ۱۳۹۰/۰۱/۳۱ ۰۸:۴۴:۲۱
    همان behaviors.serviceBehaviors.behavior.serviceMetadata در مورد حالت دوپلکس هم صادق است به همراه مورد ب اگر از mex استفاده می‌شود