2011/04/17

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


در جهت تكميل بحث "بررسي امنيتي، حين استفاده از 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 چه بايد كرد؟
پاسخ: اگر امضاي متدها و اينترفيس‌هاي تعريف شده تغييري نداشته‌اند، لزومي به هيچ نوع تغييري نيست. در غيراينصورت، سريع موارد الف و ب فوق را به حالت اول برگردانده، كلاينت مورد استفاده را به روز كنيد، مجددا متاديتا را حذف نمائيد.

4 نظرات:

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

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

    با سپاس فراوان

    پاسخحذف
  2. سلام
    سوال شما مرتبط با بحث نيست (و مطابق معمول اين موارد رو من حذف مي‌كنم) ... فقط در حالت كلي اين موارد را بايد در نظر داشت:
    استفاده از كاربران اكتيودايركتوري به همراه برنامه‌هاي وب به شدت مشكل ساز است از اين لحاظ كه هر كاربر در اكتيو دايركتوري با يك SID مشخص مي‌شود و اين SID تا زمانيكه كاربر تغييري نداشته (مثلا سرور كرش كرده، دوباره نصب شده يا كاربر حذف شده دوباره اضافه شده) معتبر است و در غير اينصورت هرچند نام جديد با نام قبلي يكي است اما چون اين SID يكي نيست، در برنامه ديگر شناسايي نخواهد شد (مشكل شايع كاربران شيرپوينت براي مثال). به عبارتي سيستم‌هاي تحت وب متكي بر تعيين اعتبار اكتيودايركتوري تا زمانيكه كاربران آن حذف نشده‌اند ... خوب كار مي‌كنند، اما، امان از روزي كه مجبور به تعريف مجدد شويد. اينجا است كه هيچ چيزي كار نمي‌كند (چون اكتيودايركتوري فقط SID را مي‌شناسد و نه اسم كه فقط ظاهر كار است).
    به همين جهت روش امنيتي Forms Authentication كه قسمتي از آن تعريف كاربران در بانك اطلاعاتي است در دراز مدت براي شما مقرون به صرفه‌تر خواهد بود.

    پاسخحذف
  3. سلام آقای نصیری
    لطفا در مورد polling duplex هم توضیح دهید

    ممنون میشم

    پاسخحذف
  4. همان behaviors.serviceBehaviors.behavior.serviceMetadata در مورد حالت دوپلكس هم صادق است به همراه مورد ب اگر از mex استفاده مي‌شود

    پاسخحذف