مجوز SSL برمبنای Authentication در پروژه Web API
یکشنبه 3 مرداد 1395در این مقاله قصد داریم شما را با مجوز 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
- ASP.net MVC
- 2k بازدید
- 3 تشکر