مجوز SSL برمبنای Authentication در پروژه Web API

یکشنبه 3 مرداد 1395

در این مقاله قصد داریم شما را با مجوز SSL بر مبنای Authentication در پروژه Web API آشنا کنیم و نحوه ی کار آن در یک پروژه را شرح دهیم.

مجوز SSL برمبنای Authentication در پروژه Web API

 فهرست مطالب :

_معرفی

_اهداف

_مجوزهای SSL Client

_نحوه ی نصب SSL Certificate

_کد SSL Authentication

  _IP Whitelisting

معرفی

در این مقاله، هدف، ویژگی ها و نحوه ی اضافه کردن SSL Certificate(مجوز SLL) بر مبنای authentication در پروژه های Web API شرح داده خواهد شد.

اهداف

Web API فرض میکند که authentication در سمت سرور و در host انجام میشود. web-hosting (میزبانی شبکه)، برعهده  IIS می باشد که از HTTP module ها برای authentication استفاده میکند. شما میتوانید پروژه خود را به گونه ای تنظیم کنید تا بتواند از هر authentication module که توسط IIS یا  ASP.NETساخته شده است، استفاده کند یا اینکه  HTTP module مخصوص خود را بنویسید تا authentication خاصی را اجرا کند.

چندین authentication scheme مشترک نمی توانند برای HTTP امنیت ایجاد کنند. در موارد خاصی ، Basic authentication و forms authentication  بدون رمزگذاری اعتبارسنجی ها، آنها را میفرستند. برای امنیت ، این authentication scheme باید از SSL استفاده کنند. بعلاوه، SSL client certificate ها میتوانند برای اعتبار سنجی کاربران مورد استفاده قرار بگیرند.

SSL client certificate

SSL با استفاده از یک کلید عمومی که زیربنایی برای مجوزهای مورد نیاز میباشد، authentication را ارائه میدهد. سرور باید یک مجوز برای کاربری که اطلاعاتش اعتبارسنجی شده است، ارائه دهد.  کمتر پیش می آید که یک کاربر مجوزی به سرور ارائه دهد، اما این مسئله یک گزینه ی اختیاری برای اعتبارسنجی کاربران میباشد. برای استفاده از مجوزهای کاربران با استفاده از SSL، نیاز است که روشی برای توزیع و دسته بندی مجوزهای امضاءدار به کاربران تعیین کنیم. برای بسیاری از برنامه ها، این روش تجربه ای خوبی برای کاربر به همراه نخواهد داشت، اما در بعضی از محیط ها ( مانند enterprise ) میتواند موثر باشد.

مزایا:

1. Certificate credentialها قدرتمندتر از username/password می باشد.

2.SSL قابلیت هایی مانند ارائه یک کانال کاملا امن، احراز هویت، یکپارچگی پیامها و پنهان کردن پیامها را دارد.

معایب:

1.شما باید از PKI certificate ها تبعیت کنید و آن را مدیریت کنید.

2. پلتفرمی که کاربر با آن کار میکند باید از SSL client certificate پشتیبانی کند.

برای پیکربندی IIS و پذیرفتن client certificate (مجوزهای کاربری)، IIS Manager را باز کنید و مراحل زیر را انجام دهید:

1.روی نود (node)  site  در tree view کلیک کنید.

2. روی قابلیت SSL Settings در قاب وسط دابل کلیک کنید.

3.در قسمت مربوط به Client Certificates، یکی از گزینه های زیر را انتخاب کنید:

Accept :  آی آی اس (IIs)یک certificate از کاربر را خواهد پذیرفت اما اجباری برای وجود آن نخواهد بود.

Require: یک certificate مورد نیاز است. (برای فعال کردن این گزینه، میتوانید "Require SSL" را نیز انتخاب کنید)

استفاده از Client Certificateها در Web API

در سمت کاربر، میتوانید client certificate توسط فراخوانی GetClientCertificate() در  request message بگیرید. اگر کاربری وجود نداشته باشد، متد مربوطه null بعنوان خروجی برمیگرداند. در غیر اینصورت، بعنوان خروجی یک نمونه از X509Certificate2 را برمیگرداند. از این شی برای گرفتن اطلاعات از certificate استفاده میشود، سپس شما میتوانید از این اطلاعات برای اعتبار سنجی  و مجوزدهی استفاده کنید.

نحوه ی نصب SSL Certificate

بطور کلی دو نوع certificate وجود دارد که شما نیاز دارید آنها را روی سیستمی که با آن برنامه نویسی میکنید نصب و تنظیم کنید.

1. certificate از نوع Certificate.cer در root مربوط به Certification Authorities نصب کنید تا سیستم محلی شما از MMC (روی فولدر  Trusted Root Certification Authorities |  Import | All Tasks دابل کلیک کنید) استفاده کند.

2. certificate از نوع ClientCert.pfx در ClientCert.pfx کامپیوتر با استفاده از MMC نصب کنید. توجه داشته باشید که certificate اطلاعاتی که توسط Certificate Authority فرستاده شده است را نمایش میدهد.

ما تقریبا certificate ها روی PY سرور نصب کردیم. مراحل زیر نحوه ی نصب  certificate های موردنیاز بر روی سرور را نمایش میدهد.

1.دو certificate بالا را روی سرور نصب نمایید.

2. certificate(مجوز) PvtSSLCert.pfx را با استفاده ازMMC در حافظه داخلی کامپیوتر خود نصب کنید. توجه کنید که certificate موردنظر نشان میدهد که توسط Certificate Authority شما، فرستاده شده است.

کد مربوط به SSL Authentication

1.	using System;  
2.	using System.Security.Claims;  
3.	using System.Security.Cryptography.X509Certificates;  
4.	using System.Threading.Tasks;  
5.	using Microsoft.Owin;  
6.	namespaceProject.Owin.Middleware  
7.	{  
8.	    ///<summary>  
9.	    /// CertificateAuthenticationMiddleware class is used to secure the web API using certificate based   
10.	    /// Authentication. This class inherits OwinMiddlerware class.  
11.	    ///</summary>  
12.	  
13.	    publicclassCertificateAuthenticationMiddleware: OwinMiddleware  
14.	    {  
15.	        conststring OwinCertFunc = "ssl.LoadClientCertAsync";  
16.	        conststring OwinCert = "ssl.ClientCertificate";  
17.	        conststring OwinCertError = "ssl.ClientCertificateErrors";  
18.	        public CertificateAuthenticationMiddleware(OwinMiddleware next): base(next)  
19.	        {}  
20.	  
21.	            ///<summary>  
22.	            /// The Invoke() method is invocked from startup class of OWIN for security.  
23.	            ///</summary>  
24.	            ///<param name="context"></param>  
25.	            ///<returns></returns>  
26.	  
27.	        publicasyncoverrideTask Invoke(IOwinContext context)  
28.	        {  
29.	            if (context.Environment.Keys.Contains(OwinCertFunc))  
30.	            {  
31.	                try  
32.	                {  
33.	                    var task = (context.Environment[OwinCertFunc] asFunc < Task > );  
34.	                    awaitTask.Run(task);  
35.	                    if (context.Environment.Keys.Contains(OwinCert))  
36.	                    {  
37.	                        var cert = context.Environment[OwinCert] asX509Certificate;  
38.	                        if (cert != null) context.Request.Environment.Add(SystemContants.OwinMannatechClientInfo, cert.Subject);  
39.	                        else  
40.	                        {  
41.	                            context.Response.StatusCode = 403;  
42.	                            return;  
43.	                        }  
44.	                    }  
45.	                    else  
46.	                    {  
47.	                        context.Response.StatusCode = 403;  
48.	                        return;  
49.	                    }  
50.	                    // Exception certError;  
51.	                    if (context.Environment.Keys.Contains(OwinCertError))  
52.	                    {  
53.	                        //certError = context.Environment[OwinCertError] as Exception;  
54.	                        context.Response.StatusCode = 403;  
55.	                        return;  
56.	                    }  
57.	                }  
58.	                catch (Exception ex)  
59.	                {  
60.	                    context.Response.StatusCode = 403;  
61.	                    return;  
62.	                }  
63.	            }  
64.	            else  
65.	            {  
66.	                context.Response.StatusCode = 403;  
67.	                return;  
68.	            }  
69.	            await Next.Invoke(context);  
70.	        }  
71.	    }  
72.	}  

IP WhiteListing

با استفاده از میان افزار OWIN می توانید طیف وسیعی از  IP Addresse  ها یا آدرس IP مشخصی را وارد whitelist کنیم. تنها به درخواست ها پاسخ داده میشود که  آدرس IP آنها در داخل این WhiteList وجود داشته باشد.

کد زیر مربوط به IP whitelisting می باشد:

1.	using System.Collections.Generic;  
2.	using System.Threading.Tasks;  
3.	using Microsoft.Owin;  
4.	namespaceProject.Owin.Middleware  
5.	{  
6.	    ///<summary>  
7.	    /// IpWhiteListMiddleware class is used to secure the web API, It gives the acess only those IP addesss   
8.	    /// which are configured in "Web.config". This class inherits OwinMiddlerware class.  
9.	    ///</summary>  
10.	  
11.	    publicclassIpWhiteListMiddleware: OwinMiddleware  
12.	    {  
13.	        privatereadonlyHashSet < string > _whitelistIps;  
14.	        public IpWhiteListMiddleware(OwinMiddleware next, HashSet < string > whitelistIps): base(next)  
15.	            {  
16.	                _whitelistIps = whitelistIps;  
17.	            }  
18.	  
19.	            ///<summary>  
20.	            /// The Invoke() method is invocked from startup class of OWIN for security.  
21.	            ///</summary>  
22.	            ///<param name="context"></param>  
23.	            ///<returns></returns>  
24.	  
25.	        publicasyncoverrideTask Invoke(IOwinContext context)  
26.	        {  
27.	            if (!_whitelistIps.Contains(context.Request.RemoteIpAddress) && !context.Request.IsLocal())  
28.	            {  
29.	                //context.Response.StatusCode = 404;  
30.	  
31.	                var response = context.Response;  
32.	                var request = context.Request;  
33.	                response.OnSendingHeaders(state =>  
34.	                {  
35.	                    var resp = (OwinResponse) state;  
36.	                    resp.StatusCode = 200;  
37.	                    resp.ReasonPhrase = "IP address is not registered"; // if you're going to change the status code  
38.	                    // you probably should also change the reason phrase  
39.	  
40.	                }, response);  
41.	                return;  
42.	            }  
43.	            await Next.Invoke(context);  
44.	        }  
45.	    }  
46.	}  

Startup.cs

1.	publicclassStartup  
2.	{  
3.	    ///<summary>  
4.	    /// Owin Configuration method for IP Whitelisting and the Certificate based authentication  
5.	    ///</summary>  
6.	  
7.	    publicvoid Configuration(IAppBuilder app)  
8.	    {  
9.	        app.UseHttpTracking(newHttpTrackingOptions  
10.	        {  
11.	            TrackingStore = newHttpTrackingStore(),  
12.	                TrackingIdPropertyName = "x-tracking-id",  
13.	                MaximumRecordedRequestLength = 64 * 1024,  
14.	                MaximumRecordedResponseLength = 64 * 1024,  
15.	        });  
16.	  
17.	        string[] IPList = ConfigurationManager.AppSettings["IPWhiteList"].Split(',').Select(s => s.ToString()).ToArray();  
18.	        var whitelistIps = newHashSet < string > (IPList);  
19.	  
20.	        //var whitelistIps = new HashSet<string> { "14.140.150.214", "50.200.185.198", "67.208.128.168","10.77.5.52" };  
21.	  
22.	        app.Use(typeof(IpWhiteListMiddleware), whitelistIps);  
23.	        app.Use(typeof(CertificateAuthenticationMiddleware));  
24.	        var config = newHttpConfiguration();  
25.	        WebApiConfig.Register(config);  
26.	        app.UseWebApi(config);  
27.	        config.Services.Clear(typeof(ModelValidatorProvider));  
28.	        log4net.Config.XmlConfigurator.Configure();  
29.	    }  
30.	}  

آموزش asp.net mvc

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

نویسنده 3355 مقاله در برنامه نویسان

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

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