یکی دیگر از فایل های پایه ای در پروژه های ASP.NET Core، فایل Startup.cs است که در آن کلاسی همنام هست که در این کلاس دو متد به نام Configuration و ConfigureServices هست که در این نوشته می خواهیم این دو متد و برخی دیگر از کلاس های ASP.NET Core را بررسی کنیم. کلاس Startup جایی است که:

  • سرویس مورد نیاز برنامه پیکربندی می شوند.
  • روند اداره کردن درخواست ها تعریف شده اند.

بنابراین در پروژه های ASP.NET Core یک کلاس راه انداز (یا Startup) باید باشد که به طور پیش فرض نام این کلاس Startup است و در فایل Startup.cs نیز تعریف شده است.

مفهوم سرویس ها در ASP.NET Core و متد ConfigureServices

سرویس ها مولفه هایی هستند که درون برنامه به کار گرفته می شوند. برای نمونه مولفه لاگ کردن رویدادها، یک نمونه از سرویس ها است. یکی از کاربردهای کلاس Startup، رجیستر کردن سرویس ها درون پروژه ASP.NET Core است که برای این کار، متد ConfigureServices به کار گرفته می شود. متد ()ConfigureServices یک پارامتر از گونه اینترفیس IServiceCollections را دریافت می کند که نام این پارامتر ورودی service است و سپس همانند کد زیر از فایل Startup.cs از ASP.NET Core 3، به کمک نام این پارامتر، سرویس هایی به پروژه افزوده یا به گفته دیگر در پروژه رجیستر می شوند.

در کد بالا متد ()AddControllersWithViews یک سرویس است که درون پروژه رجیستر شده است. این سرویس از ASP.NET Core 3 و در پروژه های (الگوهای) ASP.NET Core MVC هست ولی در نسخه های پیش از نسخه ۳، متدی به نام ()UseMVC در پروژه های ASP.NET Core MVC بود. اکنون فرش کنید می خواهید سرویس برای پشتیبانی از موتور نما Razor را درون پروژه رجیستر کنید، بنابراین باید متد ()ConfigureServices به گونه زیر باشد که متد ()AddRazorPages را به آن بی افزاییم.

سرویس IServiceCollection

IServiceCollection اینترفیسی است که در فضای نام Microsoft.Extensions.DependencyInjection تعریف شده است. یک سرویس (Service) مولفه های دوباره قابل استفاده است که هر سرویس عملکردی از برنامه را پیاده سازی می کند. سرویس ها باید درون متد ()ConfigureServices رجیستر شوند و سپس در برنامه و به کمک مفهوم تزریق وابستگی (Dependency Injection) یا به کمک ApplicationServices درون برنامه به کار گرفته شوند.

متد ()ConfigureServices اختیاری است و پیش از فراخوانی متد ()Configure برای پیکربندی سرویس های برنامه، متد ()ConfigureServices توسط میزبان (Host) فراخوانی می شود. توجه کنید سرویس ها برای افزوده و رجیستر شدن از یک قاعده نامگذاری به شیوه {Add{ServiceName استفاده می کنند. برای نمونه می توان به AddDbContext یا AddDefaultIdentity یا AddEntityFrameworkStores و AddRazorPages اشاره کرد.

IServiceCollections یک ظرف یا Container است که سرویس ها به آن افزوده می شوند. با اضافه شدن سرویس ها به این ظرف یا مخزن، این سرویس ها در هرجایی از برنامه و همچنین در متد ()Config برای تزریق وابستگی در دسترس خواهند بود. به گفته دیگر می توانیم هر جایی از برنامه، سرویس های افزوده شده به IServiceCollections را تزریق (Inject) کنیم.

متد ()Configure

این متد چگونگی پاسخ دادن (Response) برنامه به درخواست HTTP (یا HTPP Request) را مشخص می کند. در واقع درون این متد مولفه های میان افزار (Middleware) تعیین می شود که این میان افزارها هر یک از درخواست های ورودی به برنامه را اداره می کنند.  متد دارای دو پارامتر ورودی از نوع های IApplicationBuilder و IWebHostingEnvironment است. البته در نوشته – گفتیم که در نسخه های پیش از ASP.NET Core 3، پارامتر دوم از نوع IHostingEnvironment بوده است.

در خط های ۳ تا ۱۲ نخست بررسی می شود که آیا محیط برنام، Development است یا نه؟ توجه کنید که متغیر یا نمونه env از نوع اینترفیس IWebHostingEnvironment است و همچنین پیش از این گفتیم که در فایل launchSettings.json متغیر محیطی ASPNETCORE_ENVIRONMENT محیط کنونی برنامه را در خودش نگه می دارد که پیش فرض برابر با Development است و همچنین پس از اجرای پروژه، نخست این متغیر از فایل launchSettings.json خوانده شده و در ویژگی (Property) به نام EnvironmentName از اینترفیس IWebEnvironment ریخته می شود. بنابراین ()env.isDevelopment مقدار true برگشت می دهد، اگر محیط Development باشد و در این صورت، متدی به نام ()UseDeveloperExceptionPage از اینترفیس IApplicationBuilder به کمک متغیر یا شی app از نوع IApplicationBuilder فراخوانی می شود که درباره آن در نوشته پیش رو گفته ایم.

بنابراین اگر محیط Development نباشد، پس باید دو متد ()UseExceptionHandler و ()UseHsts فراخوانی شوند که هر دو نیز از اعضای اینترفیس IApplicationBuilder هستند. اینترفیس های IApplicationBuilder و IWebHostEnvironment به ترتیب در فضاهای نام Microsoft.AspNetCore.Builder و Microsoft.Extensions.Hosting تعریف شده اند.

متدهایی که در ()Configure فراخوانی می شوند، اول نام آنها Use است، همانند ()UseDeveloperExceptionPage یا ()UseExceptionHandler و ()UseHsts که همگی میان افزارهایی هستند که به کمک نمونه اینترفیس IApplicationBuilder در دسترس هستند. بنابراین می توان گفت که در این متد، میان افزارهای دلخواه به روند درخواست های آمده به پروژه اضافه می شوند. در زنجیره یا روند درخواست، هر مولفه میان افزار مسئول فراخوانی میان افزار بعدی خودش است.

HSTS چیست

در این نوشته درباره کلاس Startup از فایل Startup.cs گفتگو و چندین متد سرویس و میان افزار را نیز بررسی کردیم ولی یکی از متدهای میان افزار پیش فرض به نام ()UseHtst جا ماند که در این نوشته می خواهیم درباره آن بگوییم. در این نوشته می خواهیم درباره این بگوییم که چگونه HTTPS را برای همه درخواست ها اجباری و چگونه همه درخواست های HTTP را به HTTPS هدایت (Redirect) کنیم.

HSTS (کوتاه شده HTTP Strict Transport Security) یک مکانیزم برای امنیت وب است که به محافظت از وب سایت ها در برابر حمله های Downgrade attack یا Session hijacking کمک می کند. این مکانیزم به مرورگرهای وب یا هر برنامه سمت مشتری دیگری اعلام می کند که باید از اتصال های امن HTTPS استفاده کنند که متشکل از پروتکل HTTP و گواهینامه SSL هستند.

زمانی که مرورگر یک هدر پاسخ که دربرگیرنده HSTS است را دریافت می کند، آنرا نگهداری خواهد تا پیکربندی هایی را برای آن دامنه (نشانی سایت) نگهداری می کند تا بتواند از این پس تنها بر روی پروتکل HTTPS درخواست ها را فرستد و از فرستاده شدن بر روی HTTP پیش گیری شود. استفاده از مکانیزم HSTS تنها زمانی ممکن است که دست کم یک بار اتصال HTTPS ایجاد شده باشد. از این پس هر درخواست HTTP به یک HTTPS نگاشت داده می شود. از ASP.NET Core 2.2 از متد ()UseHsts برای پیاده سازی مکانیزم HSTS استفاده می شود.