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

زمان کار روی محیط client server، امنیت داده ها یا پیغام ها بسیار مهم است. قبل از انجام هر کار یا هر انتقال داده ای باید مطمئن شوید که اقدامات امنیتی انجام گرفته است. همچنین نیاز است که امنیت ترکیبی نیز ایجاد شود. در این مقاله می خواهیم در مورد امنیت wcf صحبت کنیم. inbuilt provision توسط مایکروسافت ازNet framework 3.0. به بعد ارائه شده است.

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

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

WCF انواع پروتکل ها مانند، TCP، HTTP و MSMQT،را پشتیبانی می کند. کاربر باید به اندازه کافی مطمئن باشد که اقدامات لازم برای محافظت از پیغام انجام شده است. همچنین نیاز است که سیاست های امنیتی برای حفاظت پیام ها، احراز هویت و اعتبار تماس ها برقرار باشد. WCF یک محیط بسیار آسان و قابل تنظیم برای پیاده سازی امنیت ارائه می کند.

WCF از موارد زیر پشتیبانی می کند:

پیغام(Message)

انتقال داده(Transport)

انتقال با مجوز پیام(TransportWithMessageCredential)

امنیت پیغام:

امنیت پیام برای مشخصات WS-Security جهت تامین پیام های امنیتی مورد استفاده قرار می گیرد. یک پیام با استفاده از مجوز و گواهی رمزنگاری شده و می تواند به طور امن به هر پورتی و با استفاده از http منتقل شود. این کار امنیت اتصال انتها به انتها را فراهم می کند. چرا که امنیت پیام به طور مستقیم رمزنگاری شده و پیغام ها را نشانه گذاری می کند، داشتن واسطه ها امنیت را از بین نمی برد. امنیت پیام زمانی که کلاینت روی اینترنت مستقر شده، می تواند، استفاده شود.

امنیت انتقال:

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

TransportWithMessageCredential:

این مورد را می توانیم ترکیبی از پیاده سازی پیام و امنیت انتقال بنامیم. این گواهی ها با یک پیام و حفاظت پیام ارسال شود و احراز هویت سرور بوسیله لایه انتقال فراهم می شود.

پیاده سازی TransportWithMessageCredential

مرحله 1: ایجاد یک certificate

ما باید هر دو مجوزهای کلاینت و سرور را ایجاد کنیم.

    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 را از Microsoft نصب کنید. اگر این برنامه را در حال حاضر به صورت نصب شده دارید، می توانید makecert.exe را در "C:\Program Files\Microsoft SDKs\Windows\v5.1\Bin" پیدا کنید.

هردو مجوز ها ایجاد شده اند اما آنها در دسته بندی قابل اعتماد(trusted) قرار ندارند. برای همین Microsoft Management Console را باز کرده، به گزینه Run بروید و "MMC" را اجرا کنید.

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

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

مرحله 2: پیکربندی 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>

 

مرحله 3: کد (IService1 (interface

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();  

و حالا کد ذکر شده را در متد اصلی استفاده کنید.

دانلود نسخه ی PDF این مطلب