پیاده سازی امنیت در WCF

دوشنبه 7 دی 1394

هنگام کار کردن روی محیط سمت سرویس گیرنده ، امنیت داده یا پیام بسیار اهمیت دارد. در این مقاله قصد داریم درباره امنیت WCF صحبت کنیم. شرایط داخلی است که از .Net Framework 3.0 توسط مایکروسافت فراهم شد.

پیاده سازی امنیت در  WCF

هنگام کار کردن روی محیط سمت سرویس گیرنده ، امنیت داده یا پیام بسیار اهمیت دارد. در این مقاله قصد داریم درباره امنیت WCF صحبت کنیم. شرایط داخلی است که از .Net Framework 3.0  توسط مایکروسافت فراهم شد.

 WCF  یا  Windows Communication Foundation یک پلت فرم پیام رسانی امن ، قابل اعتماد و مقیاس پذیر برای .NET Framework 3.0  است.  

 در صورت تمایل میتوانید به صورت رایگان آموزش WCF به همراه پروژه عملی را در سایت تاپ لرن مشاهده کنید .

 WCF از پروتکل های مختلف پشتیبانی میکند به طور مثال:  TCP , HTTP و  MSMQ . کاربر باید از اقدامات لازم برای حفاظت از پیام ها اطمینان داشته باشد و همچنین باید برقراری سیاست های امنیتی برای حفاظت پیام و برای احراز هویت و اجازه تماس ها برقرار کند.  WCF  یک محیط با قابلیت تنظیم بسیار آسان و غنی برای پیاده سازی امنیت فراهم میکند.

 WCF  از امنیت های زیر پشتیبانی میکند.

 Message

  Transport

Transport  همراه با  MessageCredential

 امنیت پیام   Message Security :

 Message Security از مشخصات  WS-Security برای امنیت پیام ها استفاده میکند. پیام با استفاده از گواهی نامه هایی  رمزنگاری می شود و می تواند به صورت امن روی هر پورت با HTTP ساده فرستاده شود که امنیت  end-to-end را فراهم می سازد. زیرا امنیت پیام مستقیما پیام ها را رمزگذاری و نشانه گذاری میکند، داشتن واسطه باعث شکسته شدن امنیت نمی شود.

  امنیت   حمل و نقل  Transport Security  :

 Transport Security  یک پروتکل امنیتی پیاده سازی شده است که به صورت Point to Point  کار میکند. این امنیت وابسته به پروتکل است و پشتیبانی امنیتی آن  به محدودیت های امنیتی پروتکل وابسته است. معمولا از آن زمانی استفاده می شود که کاربر در یک اینترانت  intranet مستقر باشد که امنیت  Point to Point  را فراهم میکند و عملکرد بهتری نسبت به امنیت پیام دارد.

حمل و نقل با گواهی پیام  Transport With Message Credential   :

در اینجا از هر دوی امنیت پیام و امنیت ارسال یا حمل و نقل استفاده می شود . اعتبار نامه ها با پیام منتقل می شوند و امنیت پیام و احراز هویت سرور توسط لایه  Transport  فراهم می شود.

پیاده سازی آن به صورت زیر می باشد:

ایجاد اعتبارنامه :

لازم است تا هر دو اعتبارنامه سمت سرویس گیرنده و سرویس ایجاد شوند.

makecert.exe -sr CurrentUser -ss My -a sha1 -n CN=CertTestServer -sky exchange –pe
makecert.exe -sr CurrentUser -ss My -a sha1 -n CN=CertTestClient -sky exchange –pe

به منظور انجام این کار به نصب  SDK از مایکروسافت نیاز است. می توانید  Mackecertرا در     "C:\Program Files\Microsoft SDKs\Windows\v5.1\Bin"    پیدا کنید.

هر دو اعتبار نامه ایجاد شده اند اما در رده قابل اعتماد قرار ندارند . برای این کار  Microsoft Managemet Console را باز کنید. در  Run    دستور  MMC را اجرا کنید .

اکنون کنسول باز شده است به File  رفته و بر روی  Add/Remove Snap-in  کلیک کنید ، و در پنجره سمت چپ اعتبارنامه را انتخاب کنید و بر روی دکمه  Add  کلیک کنید.

هم اکنون اعتبارنامه ها به صفحه کنسول اضافه شده اند . در اینجا ممکن است دسته بندی های متفاوتی از اعتبارنامه ها داشته  باشید . اگر پوشه  Personal را باز کنید ، اعتبارنامه هایی را که قبلا ایجاد شد را می توانید ببینید. آنها را در پوشه Trusted People  کپی کنید و کنسول را ببندید.

قدم بعدی ایجاد تغییرات در  تنظیمات  Web.Config است.

<bindings>  
  <wsHttpBinding>  
    <binding name="wsHttpEndpointBinding">  
      <security mode="TransportWithMessageCredential">  
        <message clientCredentialType="Certificate" /> //user can use username as well  
         </security>  
    </binding>  
  </wsHttpBinding>  
</bindings>  
<behaviors>  
  <serviceBehaviors>  
    <behavior name="MessageSecurity.Service1Behavior">  
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->  
       <serviceMetadata httpGetEnabled="true" />  
         <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->  
         <serviceDebug includeExceptionDetailInFaults="false" />  
         <serviceCredentials>  
           <clientCertificate>  
            <authentication certificateValidationMode="PeerTrust" />  
             </clientCertificate>  
              <serviceCertificate findValue="CertTestServer" storeLocation="CurrentUser" storeName="TrustedPeople" x509FindType="FindBySubjectName" />  
              <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="MessageSecurity.AuthenticationHelper,MessageSecurity " />  
         </serviceCredentials>  
       <!--<serviceDebug includeExceptionDetailInFaults="False"/>-->  
    </behavior> 

قدم بعدی نوشتن کدها به صورت زیر در IService1 است :

    public class Service1: IService1   
    {#  
        region IService1 Members  
      
        public List < Book > GetAllBooks()   
        {  
            List < Book > lstBook = new List < Book > ();  
            //Checking for authorization  
            if (OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.IsAuthenticated == false)   
            {  
                throw new SecurityException();  
            } else   
            {  
                //Using LINQ to read the XML  
                var xdoc = XDocument.Load(@"D:\Nishant\Project\MessageSecurity\MessageSecurity\Book.xml");  
                //Getting all details of Book....  
                var units = from u in xdoc.Descendants("book")  
                select new   
                {  
                    Id = (string) u.Element("author"),  
                        Title = (string) u.Element("title"),  
                        Genre = (string) u.Element("genre"),  
                        Price = (string) u.Element("price"),  
                        PublishDate = (string) u.Element("publishdate"),  
                        Description = (string) u.Element("description")  
                };  
                //Looping and storing the same in Book object  
                foreach(var unit in units)   
                  {  
                    // GOD IntelliSense!!!!!! saves us..(:  
                    Book book = new Book();  
                    book.Author = unit.Id;  
                    book.Title = unit.Title;  
                    book.Genre = unit.Genre;  
                    book.Price = unit.Price;  
                    book.PublishDate = unit.PublishDate;  
                    book.Description = unit.Description;  
                    //Adding the book to list of books....  
                    lstBook.Add(book);  
                }  
            }  
            return lstBook;  
        }  
      
        public string GetData(int value)   
        {  
            return string.Format("Comunication through Message Security: {0}", value);  
        }#  
        endregion  
    }  

یک پروژه جدید ایجاد کنید ، و منبع سرویس را به صورت زیر در آن اضافه کنید.

    ServiceReference2.Service1Client objservice = new Test.ServiceReference2.Service1Client();  
    ServiceReference2.Book[] lstBook = objservice.GetAllBooks();  

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • WCF
  • 3k بازدید
  • 3 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید