برای انتقال جداول احراز هویت (Identity) از SQL Server به بانک اطلاعاتی
MongoDB و نحوه استفاده از آن در ASP.Net Core از سورس نمونه در لینک بالا استفاده کنید.
همچنین میتوانید از پکیج AspNetCore.Identity.Mongo استفاده کنید.
This is a MongoDB provider for the ASP.NET Core 2 Identity framework
روشهای استفاده از کش در View در Asp.net core تغییرات و بهبودهای اساسی داشته است. یکی از امکاناتی که به Tag Helperهای مرتبط به کش افزوده شده است امکان استفاده از کش توزیع شده(Distributed-Cache) است.
با تنظیمات و سازوکارهای خود Asp.net core میتوان کش را از Sql Server و Redis استفاده کرد و بخشهای مختلف صفحه را در این کشهای توزیع شده ذخیره و بازیابی کرد.
شما میتوانید یک container مخصوص SQL Server داشته باشید و یکی هم مخصوص برنامهی ASP.NET خودتان که IIS را اجرا میکند. بعد این وسط باید بین اینها سیم کشی کرد. این سیم کشی در قسمت بعدی تحت عنوان docker-compose بحث شده. همچنین چند مثال هم مانند «اجرای پروژهی ASP.NET Core Music Store توسط docker-compose» در آن بحث شدند که به همراه این سیمکشیها هستند.
برای هر کوئری که به SQL Server ارسال میشود، یک Plan تولید خواهد شد. این عملیات نیز توسط بخش Query Optimizer آغاز میگردد. به آن میتوان همانند فریمورکی که درون SQL Server قرار گرفته و کارش یافتن یک Query Plan مناسب مخصوص کوئری رسیدهاست، نگاه کرد. ابتدا عملیات Parsing صورت میگیرد. توسط آن Syntax کوئری رسیده بررسی شده و صحت آن تائید میگردد. پس از آن یک Parser tree تولید میشود که نمای درونی آن کوئری است. سپس فاز Binding رخ میدهد که در آن بررسی میشود که آیا تمام اشیاء موجود درخواستی توسط کوئری وجود داشته و توسط کاربر قابل دسترسی هستند. خروجی این فاز یک Query Tree است که به فاز بهینه سازی ارسال میشود. یک Query Tree به همراه اعمالی منطقی است. این اعمال منطقی توصیف رخدادهایی میباشند که قرار است اتفاق بیفتند؛ مانند خواندن اطلاعات از یک جدول، مرتب سازی اطلاعات، ایجاد جوین و غیره. سپس بهینه ساز، این اعمال منطقی را تبدیل به اعمال فیزیکی میکند. برای مثال خواندن اطلاعات از یک جدول، تبدیل به یک Index seek میشود. یک جوین تبدیل به یک حلقهی تو در تو میشود. در آخر این اعمال فیزیکی در کنار هم قرار گرفته و Query Plan را تشکیل میدهند و ما به عنوان یک توسعه دهنده میتوانیم با بررسی این Plan دریابیم که SQL Server با کوئری رسیده، چگونه برخورد کرده و قرار است چگونه آنرا اجرا کند.
Plan چیست؟
در اینجا Plan کوئری سادهای را مشاهده میکنید. کار آن انتخاب نام، نام خانوادگی و آدرس ایمیل افرادی است که نام خانوادگی آنها با Whit شروع میشود و بر روی دو جدول که با هم جوین شدهاند عمل میکند.
اولین موردی را که باید در یک Plan به آن دقت کرد، عملگرهای آن است که شامل select، nested loop، index seek و clustered index seek میباشند. index seek بر روی جدول اشخاص و clustered index seek بر روی جدول ایمیلها صورت میگیرد. nested loop بیانگر جوین بین جداول است. این عملگرها بیانگر اعمال فیزیکی هستند که رخ دادهاند.
همچنین تعدادی پیکان (arrow) را هم مشاهده میکنید که بیانگر جهت سیلان دادهها است. اطلاعات از طریق index seek و clustered index seek به nested loop میرسند و در نهایت به عملگر select ارائه خواهند شد.
در این تصویر، هزینههای تخمینی مرتبط با هر عملگر نیز قابل مشاهدهاست که نسبت به کل کوئری محاسبه شدهاند. این هزینه، بدون واحد است و به معنای میزان زمان و یا CPU صرف شدهی برای انجام عمل خاصی نیست و صرفا برای مقایسهی هزینهی نسبی عملگرها در کل یک Plan کاربرد دارد. باید دقت داشت که هزینههای نمایش داده شدهی در یک Plan، همیشه تخمینی هستند. در قسمتهای قبل در مورد نحوهی دریافت estimated plan و actual plan بحث کردیم. هیچگاه چیزی به نام Actual cost در یک Actual plan وجود ندارد و همیشه تخمینی است. روش محاسبهی آنها توسط الگوریتمهای بهینه ساز است و مستقل از سخت افزار مورد استفاده.
در یک پلن، مدت زمان انجام یک کوئری، میزان I/O ، locks و wait statistics قابل مشاهده نیستند. البته اگر از SQL Server 2016 به بعد استفاده میکنید و یک Actual plan را محاسبه کردهاید، مدت زمان انجام یک کوئری و میزان I/O نیز در Plan قابل مشاهدهاند.
از چه جهتی باید یک Plan را خواند؟
اگر هدف، بررسی «سیلان کنترل» است (Control flow)، باید یک Plan را از «چپ به راست» خواند. یعنی از عملگر select شروع میکنیم که کوئری ما را کنترل میکند. سپس به nested loop میرسیم که نام و نام خانوادگی را از جدول اشخاص دریافت میکند. این nested loop نیز با کمک ایندکسهای تعریف شده، شرط کوئری را بر آورده میکند.
اما جهت «سیلان اطلاعات» در یک Plan از «راست به چپ» است (Data flow). اطلاعات از طریق index seekها به حلقه و سپس select میرسند.
چگونه یک Query Plan را شروع به بررسی کنیم؟
ابتدا در management studio از منوی Query، گزینهی Include actual execution plan را انتخاب میکنیم. سپس کوئری زیر را اجرا میکنیم:
نتیجهی آن تولید Query Plan زیر است:
در اینجا چهار عملگر select، nested loop، clustered index seek و clustered index scan مشاهده میشوند. شاید اینطور به نظر برسد که در این Plan، ابتدا clustered index scan و clustered index seek انجام میشوند و سپس به nested loop میرسیم (اگر Plan را بر اساس سیلان داده، از راست به چپ بخوانیم)؛ اما اینطور نیست. عملگرها در اینجا در حقیقت یک سری iterator هستند که با دریافت ردیفهای مرتبط، بلافاصله آنها را به nested loop ارسال میکنند. این nested loop نیز ردیفهایی را که با جوین انجام شده تطابق دارند، به سمت select ارسال میکند.
اگر به تصویر دقت کنید هر کدام از ایندکسها به یک جدول اشاره میکنند که نام آن بالای عدد هزینه درج شدهاست. برای مشاهده نام کامل شیء متناظر با آن، میتوان اشارهگر ماوس را بر روی ایندکس حرکت داد و به اطلاعات قسمت Object دقت کرد:
و یا اگر اطلاعات کاملتری از این popup را نیاز داشتید، عملگر مدنظر را انتخاب کرده و سپس دکمهی F4 را فشار دهید:
در برگهی خواص ظاهر شده میتوان ریز جزئیات تمام اطلاعات مرتبط با عملگر انتخاب شده را مشاهده کرد. برای مثال در اینجا حتی اطلاعات Logical reads را بدون روشن کردن SET STATISTICS IO ON میتوان مشاهده کرد:
همچنین با توجه به انتخاب گزینهی Include actual execution plan، تعداد ردیفهای بازگشت داده شدهی واقعی و تخمینی، با هدایت اشارهگر ماوس بر روی یکی از اشیاء مرتبط با بررسی ایندکسها، قابل مشاهده هستند:
گزارش این تعداد ردیفها، با حرکت اشارهگر ماوس، بر روی پیکانهای منتهی به nested loop و یا select نیز قابل مشاهده هستند:
به این ترتیب میتوان دریافت که چه مقدار اطلاعات در طول این Plan و قسمتهای مختلف آن، از سمت راست به چپ، در حال جابجایی است.
اکنون در ادامه سعی میکنیم توسط DMO's، این Plan را از Plan cache دریافت کنیم:
ستون آخر این کوئری به query_plan اشاره میکند که در management studio به صورت یک لینک قابل کلیک ظاهر میشود. اگر بر روی آن کلیک کنیم، به تصویر زیر خواهیم رسید:
همانطور که مشاهده میکنید، اینبار تنها اطلاعات تخمینی در این Plan ظاهر شدهاند؛ چون اطلاعات آن از کش خوانده شدهاست. همچنین در اینجا اطلاعات I/O مانند حالت Actual Plan، در برگهی خواص عملگرهای این Plan، قابل مشاهده نیستند.
نگاهی به اطلاعات XML ای یک Plan
اگر کوئری زیر را با فرض انتخاب Include actual execution plan در منوی Query اجرا کنیم:
به این Plan خواهیم رسید که نوع بررسی ایندکسها و جوین آن متفاوت است:
در اینجا با کلیک راست بر روی Plan، میتوان گزینهی Show Execution Plan XML را نیز انتخاب کرد. گاهی از اوقات کار کردن با این اطلاعات، به صورت XML ای سادهتر است و فرمت آن از هر نگارش به نگارش دیگر SQL Server میتواند متفاوت باشد.
برای مثال اگر در برگهی نمایش این اطلاعات، دکمههای ctrl+f را فشرده و به دنبال runtime بگردیم، خیلی سریعتر میتوان به اطلاعات I/O ،CPU و تعداد ردیفهای بازگشت داده شده، رسید.
و یا حتی اطلاعات wait statistics را نیز میتوان به سادگی در اینجا مشاهده کرد تا مشخص شود چرا یک کوئری خوب عمل نمیکند:
اجرای چند کوئری با هم و بررسی Query Plan آنها
اگر دو کوئری زیر را با فرض انتخاب Include actual execution plan در منوی Query با هم اجرا کنیم:
به این Plan خواهیم رسید که نکتهی مهم آن، هزینهی انجام کوئریها است:
هزینهی اولین کوئری نسبت به کل batch جاری، 10 درصد است و هزینهی دومین کوئری، 90 درصد. بنابراین اگر چندین کوئری را با هم اجرا کنیم، به این صورت میتوان هزینهی هر کدام را نسبت به کل عملیات، تخمین بزنیم. در هر کوئری نیز هزینههایی درج شدهاند که صرفا متعلق به همان کوئری هستند. برای مثال در اولین کوئری، key lookup سنگینترین عملگر کل کوئری است.
Plan چیست؟
در اینجا Plan کوئری سادهای را مشاهده میکنید. کار آن انتخاب نام، نام خانوادگی و آدرس ایمیل افرادی است که نام خانوادگی آنها با Whit شروع میشود و بر روی دو جدول که با هم جوین شدهاند عمل میکند.
اولین موردی را که باید در یک Plan به آن دقت کرد، عملگرهای آن است که شامل select، nested loop، index seek و clustered index seek میباشند. index seek بر روی جدول اشخاص و clustered index seek بر روی جدول ایمیلها صورت میگیرد. nested loop بیانگر جوین بین جداول است. این عملگرها بیانگر اعمال فیزیکی هستند که رخ دادهاند.
همچنین تعدادی پیکان (arrow) را هم مشاهده میکنید که بیانگر جهت سیلان دادهها است. اطلاعات از طریق index seek و clustered index seek به nested loop میرسند و در نهایت به عملگر select ارائه خواهند شد.
در این تصویر، هزینههای تخمینی مرتبط با هر عملگر نیز قابل مشاهدهاست که نسبت به کل کوئری محاسبه شدهاند. این هزینه، بدون واحد است و به معنای میزان زمان و یا CPU صرف شدهی برای انجام عمل خاصی نیست و صرفا برای مقایسهی هزینهی نسبی عملگرها در کل یک Plan کاربرد دارد. باید دقت داشت که هزینههای نمایش داده شدهی در یک Plan، همیشه تخمینی هستند. در قسمتهای قبل در مورد نحوهی دریافت estimated plan و actual plan بحث کردیم. هیچگاه چیزی به نام Actual cost در یک Actual plan وجود ندارد و همیشه تخمینی است. روش محاسبهی آنها توسط الگوریتمهای بهینه ساز است و مستقل از سخت افزار مورد استفاده.
در یک پلن، مدت زمان انجام یک کوئری، میزان I/O ، locks و wait statistics قابل مشاهده نیستند. البته اگر از SQL Server 2016 به بعد استفاده میکنید و یک Actual plan را محاسبه کردهاید، مدت زمان انجام یک کوئری و میزان I/O نیز در Plan قابل مشاهدهاند.
از چه جهتی باید یک Plan را خواند؟
اگر هدف، بررسی «سیلان کنترل» است (Control flow)، باید یک Plan را از «چپ به راست» خواند. یعنی از عملگر select شروع میکنیم که کوئری ما را کنترل میکند. سپس به nested loop میرسیم که نام و نام خانوادگی را از جدول اشخاص دریافت میکند. این nested loop نیز با کمک ایندکسهای تعریف شده، شرط کوئری را بر آورده میکند.
اما جهت «سیلان اطلاعات» در یک Plan از «راست به چپ» است (Data flow). اطلاعات از طریق index seekها به حلقه و سپس select میرسند.
چگونه یک Query Plan را شروع به بررسی کنیم؟
ابتدا در management studio از منوی Query، گزینهی Include actual execution plan را انتخاب میکنیم. سپس کوئری زیر را اجرا میکنیم:
USE [WideWorldImporters]; GO SELECT [s].[StateProvinceName], [s].[SalesTerritory], [s].[LatestRecordedPopulation], [s].[StateProvinceCode] FROM [Application].[Countries] [c] JOIN [Application].[StateProvinces] [s] ON [s].[CountryID] = [c].[CountryID] WHERE [c].[CountryName] = 'United States'; GO
در اینجا چهار عملگر select، nested loop، clustered index seek و clustered index scan مشاهده میشوند. شاید اینطور به نظر برسد که در این Plan، ابتدا clustered index scan و clustered index seek انجام میشوند و سپس به nested loop میرسیم (اگر Plan را بر اساس سیلان داده، از راست به چپ بخوانیم)؛ اما اینطور نیست. عملگرها در اینجا در حقیقت یک سری iterator هستند که با دریافت ردیفهای مرتبط، بلافاصله آنها را به nested loop ارسال میکنند. این nested loop نیز ردیفهایی را که با جوین انجام شده تطابق دارند، به سمت select ارسال میکند.
اگر به تصویر دقت کنید هر کدام از ایندکسها به یک جدول اشاره میکنند که نام آن بالای عدد هزینه درج شدهاست. برای مشاهده نام کامل شیء متناظر با آن، میتوان اشارهگر ماوس را بر روی ایندکس حرکت داد و به اطلاعات قسمت Object دقت کرد:
و یا اگر اطلاعات کاملتری از این popup را نیاز داشتید، عملگر مدنظر را انتخاب کرده و سپس دکمهی F4 را فشار دهید:
در برگهی خواص ظاهر شده میتوان ریز جزئیات تمام اطلاعات مرتبط با عملگر انتخاب شده را مشاهده کرد. برای مثال در اینجا حتی اطلاعات Logical reads را بدون روشن کردن SET STATISTICS IO ON میتوان مشاهده کرد:
همچنین با توجه به انتخاب گزینهی Include actual execution plan، تعداد ردیفهای بازگشت داده شدهی واقعی و تخمینی، با هدایت اشارهگر ماوس بر روی یکی از اشیاء مرتبط با بررسی ایندکسها، قابل مشاهده هستند:
گزارش این تعداد ردیفها، با حرکت اشارهگر ماوس، بر روی پیکانهای منتهی به nested loop و یا select نیز قابل مشاهده هستند:
به این ترتیب میتوان دریافت که چه مقدار اطلاعات در طول این Plan و قسمتهای مختلف آن، از سمت راست به چپ، در حال جابجایی است.
اکنون در ادامه سعی میکنیم توسط DMO's، این Plan را از Plan cache دریافت کنیم:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT [cp].[size_in_bytes], [cp].[cacheobjtype], [cp].[objtype], [cp].[plan_handle], [dest].[text], [plan].[query_plan] FROM [sys].[dm_exec_cached_plans] [cp] CROSS APPLY [sys].[dm_exec_sql_text]([cp].[plan_handle]) [dest] CROSS APPLY [sys].[dm_exec_query_plan]([cp].[plan_handle]) [plan] WHERE [dest].[text] LIKE '%StateProvinces%' OPTION(MAXDOP 1, RECOMPILE);
همانطور که مشاهده میکنید، اینبار تنها اطلاعات تخمینی در این Plan ظاهر شدهاند؛ چون اطلاعات آن از کش خوانده شدهاست. همچنین در اینجا اطلاعات I/O مانند حالت Actual Plan، در برگهی خواص عملگرهای این Plan، قابل مشاهده نیستند.
نگاهی به اطلاعات XML ای یک Plan
اگر کوئری زیر را با فرض انتخاب Include actual execution plan در منوی Query اجرا کنیم:
SELECT [o].[OrderID], [ol].[OrderLineID], [o].[OrderDate], [o].[CustomerID], [ol].[Quantity], [ol].[UnitPrice] FROM [Sales].[Orders] [o] JOIN [Sales].[OrderLines] [ol] ON [o].[OrderID] = [ol].[OrderID]; GO
در اینجا با کلیک راست بر روی Plan، میتوان گزینهی Show Execution Plan XML را نیز انتخاب کرد. گاهی از اوقات کار کردن با این اطلاعات، به صورت XML ای سادهتر است و فرمت آن از هر نگارش به نگارش دیگر SQL Server میتواند متفاوت باشد.
برای مثال اگر در برگهی نمایش این اطلاعات، دکمههای ctrl+f را فشرده و به دنبال runtime بگردیم، خیلی سریعتر میتوان به اطلاعات I/O ،CPU و تعداد ردیفهای بازگشت داده شده، رسید.
و یا حتی اطلاعات wait statistics را نیز میتوان به سادگی در اینجا مشاهده کرد تا مشخص شود چرا یک کوئری خوب عمل نمیکند:
اجرای چند کوئری با هم و بررسی Query Plan آنها
اگر دو کوئری زیر را با فرض انتخاب Include actual execution plan در منوی Query با هم اجرا کنیم:
USE [WideWorldImporters]; GO SELECT [CustomerID], [TransactionAmount] FROM [Sales].[CustomerTransactions] WHERE [CustomerID] = 1056; GO SELECT [o].[OrderID], [ol].[OrderLineID], [o].[OrderDate], [o].[CustomerID], [ol].[Quantity], [ol].[UnitPrice] FROM [Sales].[Orders] [o] JOIN [Sales].[OrderLines] [ol] ON [o].[OrderID] = [ol].[OrderID]; GO
هزینهی اولین کوئری نسبت به کل batch جاری، 10 درصد است و هزینهی دومین کوئری، 90 درصد. بنابراین اگر چندین کوئری را با هم اجرا کنیم، به این صورت میتوان هزینهی هر کدام را نسبت به کل عملیات، تخمین بزنیم. در هر کوئری نیز هزینههایی درج شدهاند که صرفا متعلق به همان کوئری هستند. برای مثال در اولین کوئری، key lookup سنگینترین عملگر کل کوئری است.
نظرات مطالب
انجام اعمال ریاضی بر روی Generics
c++ احتیاجی به این نوع پیاده سازیهای دشوار با استفاده از روشهای غیرمعمول رو نداره. هرچند خودم هم یکی از طرفدارهای پروپا قرص c# هستم ولی genericهای c# در مقابل templateهای c++ کمبود دارند. هرچند همیشه عاشق c# بودم ولی generic های c# هیچوقت انتظارات منو برآورده نکرد.
روزگاری دریافت مجوزهای SSL، گران و سخت بود. برای رفع این مشکلات مؤسسههایی مانند Let's Encrypt پدیدار شدهاند که مجوزهای SSL رایگانی را برای سایتهای اینترنتی صادر میکنند. دسترسی به سرویس آنها از طریق API ارائه شدهی آن، بسیار ساده بوده، کار با آن رایگان است و نیاز به مجوز خاصی ندارد. فقط باید دقت داشت که گواهینامههای Let's Encrypt دو ماهه هستند و وبسرور سایت شما باید اجازهی دسترسی به محل ویژهای را که جهت تعیین اعتبار دومین درخواستی ایجاد میشود، صادر کند. البته درخواست گواهی مجدد و تمدید آن در هر زمانی، حتی اگر پیش از انقضای آن باشد، مسیر است و از این لحاظ محدودیتی ندارد. در ادامه نحوهی کار با این سرویس را در ویندوزهای سرور بررسی خواهیم کرد.
دریافت برنامهی win-acme
برنامهی win-acme کار دریافت، نصب و تنظیم به روز رسانی خودکار مجوزهای Let’s Encrypt را در ویندوز بسیار ساده کردهاست و تقریبا به برنامهی استاندارد انجام اینکار تبدیل شدهاست. این برنامه، انجام مراحل زیر را خودکار کردهاست:
- اسکن IIS برای یافتن bindings و نام سایتها
- اتصال به Let’s Encrypt certificate authority و دریافت مجوزهای لازم
- درج خودکار مجوزهای دریافتی در Windows certificate store
- ایجاد HTTPS binding خودکار در IIS
- استفاده از Windows Task Scheduler، جهت ایجاد وظیفهی به روز رسانی خودکار مجوزهای درخواست شده
به همین جهت پیش از هر کاری نیاز است این برنامه را دریافت کنید:
https://github.com/PKISharp/win-acme/releases
این برنامه از دات نت نگارش 4.6.2 استفاده میکند. بنابراین نیاز است این نگارش و یا ترجیحا آخرین نگارش دات نت فریم ورک را بر روی سرور نصب کنید.
آماده سازی برنامهی ASP.NET جهت دریافت مجوزهای Let’s Encrypt
را بر روی سرور شما بررسی خواهد کرد (بنابراین سرور شما باید به اینترنت متصل بوده و همچنین مجوز دسترسی به این مسیر را عمومی کند). برنامهی win-acme این id را از سرور Let’s Encrypt به صورت خودکار دریافت کرده و فایلی را در مسیر یاد شده ایجاد میکند. سپس سرور Let’s Encrypt یکبار این مسیر را خواهد خواند. مشکل اینجا است که دسترسی به این فایل بدون پسوند در برنامههای MVC به صورت پیشفرض مسیر نیست و نیازی به تنظیمات خاصی دارد:
روش انجام اینکار در ASP.NET Core به صورت زیر است:
این اکشن متد را در هر کنترلری قرار دهید، تفاوتی نمیکند و کار خواهد کرد؛ چون attribute routing آن مستقل از محل قرارگیری آن است.
در MVC 5x پارامتر env را حذف و بجای آن از Server.MapPath و در آخر از return File استفاده کنید.
اگر این مرحله را تنظیم نکنید، در وسط کار دریافت مجوز توسط برنامهی win-acme، به علت اینکه مشخص نیست آیا شما صاحب دامنه هستید یا خیر، خطایی را دریافت کرده و برنامه متوقف میشود.
آماده سازی IIS برای دریافت مجوزهای Let’s Encrypt
ابتدا به قسمت Edit bindings وب سایتی که قرار است مجوز را دریافت کند مراجعه کرده:
و سپس bindings مناسبی را ایجاد کنید (از نوع HTTP و نه HTTPS):
برای مثال اگر سایت شما قرار است توسط آدرسهای www.dotnettips.info و dotnettips.info در دسترس باشد، نیاز است دو binding را در اینجا ثبت کنید. برای تمام موارد ثبت شده هم این تنظیمات را مدنظر داشته باشید:
برنامهی win-acme بر اساس این HTTP Bindings است که معادلهای متناظر HTTPS آنها را به صورت خودکار ثبت و تنظیم میکند.
اجرای برنامهی win-acme بر روی ویندوز سرور 2008
IISهای 8 به بعد (و یا ویندوز سرور 2012 به بعد) دارای ویژگی هستند به نام Server Name Indication و یا SNI که اجاز میدهند بتوان چندین مجوز SSL را بر روی یک IP تنظیم کرد.
در اینجا به ازای هر Bindings تعریف شدهی در قسمت قبل، یک مجوز Let’s Encrypt دریافت خواهد شد. اما چون ویندوز سرور 2008 به همراه IIS 7.5 است، فاقد ویژگی SNI است. به همین جهت در حالت عادی برای مثال فقط برای www.dotnettips.info مجوزی را دریافت میکنید و اگر کاربر به آدرس dotnettips.info مراجعه کند، دیگر نمیتواند به سایت وارد شود و پیام غیرمعتبر بودن مجوز SSL را مشاهده خواهد کرد.
برنامهی win-acme برای رفع این مشکل، از ویژگی خاصی به نام «SAN certificate» پشتیبانی میکند.
به این ترتیب با ویندوز سرور 2008 هم میتوان دامنهی اصلی و زیر دامنههای تعریف شده را نیز پوشش داد و سایت به این ترتیب بدون مشکل کار خواهد کرد. مراحل تنظیم SAN توسط برنامهی win-acme به این صورت است:
ابتدا که برنامهی win-acme را با دسترسی admin اجرا میکنید، چنین منویی نمایش داده میشود:
گزینهی N یا ایجاد مجوز جدید را انتخاب کنید.
سپس منوی بعدی را نمایش میدهد:
در این حالت برای ویندوز سرور 2008، فقط و فقط گزینهی 2 را انتخاب کنید.
سپس لیست سایتهای نصب شدهی در IIS را نمایش میدهد:
در اینجا برای مثال شمارهی 1 یا هر شمارهی دیگر متناظر با وب سایت مدنظر را انتخاب کنید.
در ادامه منوی زیر را نمایش میدهد:
لیستی را که در اینجا مشاهده میکنید، همان Bindings است که پیشتر ایجاد کردیم. عنوان میکند که برای کدامیک از اینها نیاز است مجوز دریافت و نصب شود. کلید enter را فشار دهید تا برای تمام آنها اینکار صورت گیرد.
و ... همین! پس از آن کار دریافت، نصب و به روز رسانی Bindings در IIS به صورت خودکار انجام خواهد شد. اکنون اگر به قسمت Binding سایت مراجعه کنید، این تنظیمات خودکار جدید را مشاهده خواهید کرد:
اگر به لاگ نصب مجوزها دقت کنید این دو سطر نیز در انتهای آن ذکر میشوند:
علت اینجا است که مجوزهای Let’s Encrypt طول عمر کمی دارند و در صورت به روز نشدن مداوم، کاربران دیگر قادر به مرور سایت نخواهند بود. به همین جهت این برنامه یک Scheduled Task ویندوز را نیز جهت به روز رسانی خودکار این مجوزها ایجاد و تنظیم میکند.
اجرای برنامهی win-acme بر روی ویندوزهای سرور 2012 به بعد
چون IIS ویندوزهای سرور 2012 به بعد، از نصب و فعالسازی بیش از یک مجوز SSL به ازای یک IP به صورت توکار تحت عنوان ویژگی SNI پشتیبانی میکنند، مراحل انجام آن سادهتر هستند.
ابتدا که برنامهی win-acme را با دسترسی admin اجرا میکنید، چنین منویی نمایش داده میشود:
گزینهی N یا ایجاد مجوز جدید را انتخاب کنید.
سپس منوی بعدی را نمایش میدهد:
در این حالت گزینهی 4 را انتخاب کنید (با فرض اینکه از IIS 8.0 به بعد استفاده میکنید).
سپس از شما درخواست میکند که لیست دامنه و زیر دامنههایی را که قرار است برای آنها مجوز SSL صادر شوند، به صورت لیست جدا شدهی توسط کاما، وارد کنید:
در ادامه لیست وب سایتهای ثبت شدهی در IIS را نمایش میدهد:
در اینجا شمارهی سایتی را که میخواهید برای آن مجوز صادر شود، انتخاب کنید.
و ... همین! پس از آن مجوزهای SSL درخواستی، دریافت، نصب و تنظیم خواهند شد. همچنین یک Scheduled Task هم برای به روز رسانی خودکار آن تنظیم میشود.
دریافت برنامهی win-acme
برنامهی win-acme کار دریافت، نصب و تنظیم به روز رسانی خودکار مجوزهای Let’s Encrypt را در ویندوز بسیار ساده کردهاست و تقریبا به برنامهی استاندارد انجام اینکار تبدیل شدهاست. این برنامه، انجام مراحل زیر را خودکار کردهاست:
- اسکن IIS برای یافتن bindings و نام سایتها
- اتصال به Let’s Encrypt certificate authority و دریافت مجوزهای لازم
- درج خودکار مجوزهای دریافتی در Windows certificate store
- ایجاد HTTPS binding خودکار در IIS
- استفاده از Windows Task Scheduler، جهت ایجاد وظیفهی به روز رسانی خودکار مجوزهای درخواست شده
به همین جهت پیش از هر کاری نیاز است این برنامه را دریافت کنید:
https://github.com/PKISharp/win-acme/releases
این برنامه از دات نت نگارش 4.6.2 استفاده میکند. بنابراین نیاز است این نگارش و یا ترجیحا آخرین نگارش دات نت فریم ورک را بر روی سرور نصب کنید.
آماده سازی برنامهی ASP.NET جهت دریافت مجوزهای Let’s Encrypt
سرور Let’s Encrypt، در حین صدور مجوز برای سایت شما نیاز دارد بررسی کند که آیا شما واقعا صاحب همان دومین هستید یا خیر. به همین جهت مسیر
/.well-known/acme-challenge/id
[HttpGet("/.well-known/acme-challenge/{id}")] public IActionResult LetsEncrypt(string id, [FromServices] IHostingEnvironment env) { id = Path.GetFileName(id); // security cleaning var file = Path.Combine(env.ContentRootPath, ".well-known", "acme-challenge", id); return PhysicalFile(file, "text/plain"); }
در MVC 5x پارامتر env را حذف و بجای آن از Server.MapPath و در آخر از return File استفاده کنید.
[Route(".well-known/acme-challenge/{id}")] public ActionResult LetsEncrypt(string id) { id = Path.GetFileName(id); // security cleaning var file = Path.Combine(Server.MapPath("~/.well-known/acme-challenge"), id); return File(file, "text/plain", id); }
آماده سازی IIS برای دریافت مجوزهای Let’s Encrypt
ابتدا به قسمت Edit bindings وب سایتی که قرار است مجوز را دریافت کند مراجعه کرده:
و سپس bindings مناسبی را ایجاد کنید (از نوع HTTP و نه HTTPS):
برای مثال اگر سایت شما قرار است توسط آدرسهای www.dotnettips.info و dotnettips.info در دسترس باشد، نیاز است دو binding را در اینجا ثبت کنید. برای تمام موارد ثبت شده هم این تنظیمات را مدنظر داشته باشید:
Type:http Port:80 IP address:All Unassigned
اجرای برنامهی win-acme بر روی ویندوز سرور 2008
IISهای 8 به بعد (و یا ویندوز سرور 2012 به بعد) دارای ویژگی هستند به نام Server Name Indication و یا SNI که اجاز میدهند بتوان چندین مجوز SSL را بر روی یک IP تنظیم کرد.
در اینجا به ازای هر Bindings تعریف شدهی در قسمت قبل، یک مجوز Let’s Encrypt دریافت خواهد شد. اما چون ویندوز سرور 2008 به همراه IIS 7.5 است، فاقد ویژگی SNI است. به همین جهت در حالت عادی برای مثال فقط برای www.dotnettips.info مجوزی را دریافت میکنید و اگر کاربر به آدرس dotnettips.info مراجعه کند، دیگر نمیتواند به سایت وارد شود و پیام غیرمعتبر بودن مجوز SSL را مشاهده خواهد کرد.
برنامهی win-acme برای رفع این مشکل، از ویژگی خاصی به نام «SAN certificate» پشتیبانی میکند.
به این ترتیب با ویندوز سرور 2008 هم میتوان دامنهی اصلی و زیر دامنههای تعریف شده را نیز پوشش داد و سایت به این ترتیب بدون مشکل کار خواهد کرد. مراحل تنظیم SAN توسط برنامهی win-acme به این صورت است:
ابتدا که برنامهی win-acme را با دسترسی admin اجرا میکنید، چنین منویی نمایش داده میشود:
N: Create new certificate M: Create new certificate with advanced options L: List scheduled renewals R: Renew scheduled S: Renew specific A: Renew *all* V: Revoke certificate C: Cancel scheduled renewal X: Cancel *all* scheduled renewals Q: Quit
سپس منوی بعدی را نمایش میدهد:
[INFO] Running in Simple mode 1: Single binding of an IIS site 2: SAN certificate for all bindings of an IIS site 3: SAN certificate for all bindings of multiple IIS sites 4: Manually input host names C: Cancel
سپس لیست سایتهای نصب شدهی در IIS را نمایش میدهد:
1: Default Web Site C: Cancel Choose site: 1
در ادامه منوی زیر را نمایش میدهد:
* www.dotnettips.info * dotnettips.info Press enter to include all listed hosts, or type a comma-separated lists of exclusions:
و ... همین! پس از آن کار دریافت، نصب و به روز رسانی Bindings در IIS به صورت خودکار انجام خواهد شد. اکنون اگر به قسمت Binding سایت مراجعه کنید، این تنظیمات خودکار جدید را مشاهده خواهید کرد:
اگر به لاگ نصب مجوزها دقت کنید این دو سطر نیز در انتهای آن ذکر میشوند:
[INFO] Adding renewal for Default Web Site [INFO] Next renewal scheduled at 2018/7/21 4:19:20 AM
اجرای برنامهی win-acme بر روی ویندوزهای سرور 2012 به بعد
چون IIS ویندوزهای سرور 2012 به بعد، از نصب و فعالسازی بیش از یک مجوز SSL به ازای یک IP به صورت توکار تحت عنوان ویژگی SNI پشتیبانی میکنند، مراحل انجام آن سادهتر هستند.
ابتدا که برنامهی win-acme را با دسترسی admin اجرا میکنید، چنین منویی نمایش داده میشود:
N: Create new certificate M: Create new certificate with advanced options L: List scheduled renewals R: Renew scheduled S: Renew specific A: Renew *all* V: Revoke certificate C: Cancel scheduled renewal X: Cancel *all* scheduled renewals Q: Quit
سپس منوی بعدی را نمایش میدهد:
[INFO] Running in Simple mode 1: Single binding of an IIS site 2: SAN certificate for all bindings of an IIS site 3: SAN certificate for all bindings of multiple IIS sites 4: Manually input host names C: Cancel
سپس از شما درخواست میکند که لیست دامنه و زیر دامنههایی را که قرار است برای آنها مجوز SSL صادر شوند، به صورت لیست جدا شدهی توسط کاما، وارد کنید:
Enter comma-separated list of host names, starting with the primary one: dotnettips.info, www.dotnettips.info
1: Default Web Site 2: mysiteName Choose site to create new bindings: 1
و ... همین! پس از آن مجوزهای SSL درخواستی، دریافت، نصب و تنظیم خواهند شد. همچنین یک Scheduled Task هم برای به روز رسانی خودکار آن تنظیم میشود.
نظرات اشتراکها
دریافت کتاب Pro ASP.NET Core MVC
دریافت ویرایش هفتم Pro ASP.NET Core MVC 2
موارد جدید در این ویرایش:
- کاملا برای ویژوال استادیو 2017، C# 7 و .NET Core 2 به روز رسانی شده است.
- ویژگیهای جدید مثل View Filterها پوشش داده شده است.
- پلتفرمها و ابزارهای گستردهتری بیشتر از هر موقعی مورد بررسی قرار گرفته اند؛ از Visual Studio Code و .NET Core در پلتفرمهای غیر ویندوزی نیز استفاده شده است.
- توزیع برنامه بر اساس Docker
اشتراکها
نقشه های رویداد پذیر Asp.net + SVG
نظرات مطالب
ASP.NET MVC #5
در مورد فعال کردن MvcBuildViews من وقتی این کارو انجام میدم با خطای زیر روبه رو میشم.
Error1The type or namespace name 'Optimization' does not exist in the namespace 'System.Web' (are you missing an assembly reference?)c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\temp\93647db0\578ae027\App_Web_krwrdmvd.0.cs26