عنوان:

‫چرا باید از گواهی TLS جدید دات‌نت ۱۰ استفاده کنید؟


نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۷/۰۳ ۱۰:۴۹
آدرس: www.dntips.ir
توسعه‌دهندگان دات‌نت اغلب هنگام توسعه محلی (Local Development) به دنبال شبیه‌سازی دقیق محیط تولید (Production Environment) هستند. با این حال، یک مشکل رایج و پنهان در توسعه ASP.NET Core وجود دارد که می‌تواند منجر به اشکالات گیج‌کننده و اتلاف وقت شود: تک‌دامنه بودن localhost. در این مقاله به این مشکل و راه‌حل نوآورانه دات‌نت ۱۰ (NET 10.) برای غنی‌سازی محیط توسعه محلی و افزایش اطمینان در استقرار خواهیم پرداخت.

مشکلlocalhost: تداخل کوکی‌ها

localhost محیطی است که اکثر توسعه‌دهندگان ASP.NET Core با آن آشنا هستند. اما همین نام پرکاربرد، یک ایراد اساسی را پنهان می‌کند: localhost یک دامنه‌ی واحد است.
همان‌طور که مستندات موزیلا در مورد کوکی‌ها مشخص می‌کند، ویژگی Domain یک کوکی مشخص می‌کند که کدام سرور و زیر دامنه‌هایش می‌توانند آن کوکی را دریافت کنند.
"ویژگی‌های Domain و Path محدوده یک کوکی را تعریف می‌کنند: کوکی‌ها به کدام URLها ارسال می‌شوند... ویژگی Domain مشخص می‌کند که کدام سرور می‌تواند کوکی را دریافت کند. اگر مشخص شود، کوکی‌ها در سرور مشخص شده و زیر دامنه‌های آن در دسترس هستند." - مستندات موزیلا
برای توسعه‌دهندگانی که چندین برنامه را به صورت محلی اجرا می‌کنند (مثلاً در یک راه‌حل میکروسرویس یا در حال کار بر روی چندین پروژه وابسته)، این موضوع به یک مشکل تبدیل می‌شود. هر کوکی که در دامنه localhost تنظیم شود، توسط هر برنامه ASP.NET Core دیگری که روی همین دامنه میزبانی می‌شود (حتی در پورت‌های مختلف)، ارسال و پردازش خواهد شد.
این "نشت کوکی" (Cookie Bleeding) از یک برنامه به برنامه دیگر می‌تواند عواقب جدی داشته باشد:
  • تداخل نام و بازنویسی کوکی‌ها: دو برنامه کوکی با نام یکسان تنظیم کنند.
  • تغییرات ناخواسته رفتاری: برنامه‌ای داده‌های کوکی متعلق به برنامه دیگر را بخواند و بر اساس آن تصمیم بگیرد.
  • کند شدن درخواست‌ها: با پردازش کوکی‌های زیاد و غیرضروری، سرعت درخواست‌ها کاهش یابد.
  • درخواست‌های نامعتبر (Bad Requests): کوکی‌ها از حد مجاز اندازه تجاوز کنند.
در بهترین حالت، شما مجبورید وقت گران‌بهای خود را صرف پاک کردن کوکی‌ها کنید، و در بدترین حالت، روزها را صرف اشکال‌زدایی باگ‌هایی خواهید کرد که فقط در محیط‌های توسعه‌ای که از یک دامنه مشترک استفاده می‌کنند، ظاهر می‌شوند.

مثال عملی

فرض کنید دو برنامه وب بسازیم. برنامه اول یک کوکی به نام "cookie" با مقدار "chocolate chip" تنظیم می‌کند. برنامه دوم تلاش می‌کند این کوکی را بخواند. اگر هر دو برنامه روی localhost با پورت‌های متفاوت (مثلاً https://localhost:7014 و https://localhost:7128) اجرا شوند، برنامه دوم به اشتباه می‌تواند به کوکی تنظیم شده توسط برنامه اول دسترسی پیدا کند. این رفتار، شبیه‌سازی محیط تولید نیست؛ چرا که در محیط تولید هر برنامه معمولاً دامنه منحصر به فرد خود را دارد.

راه‌حل دات‌نت ۱۰: گواهی TLS محلی جدید

دات‌نت ۱۰ با ارائه یک گواهی توسعه‌دهنده (Developer Certificate) جدید، این مشکل را حل می‌کند. هنگام نصب دات‌نت ۱۰ یا با اجرای دستورات زیر، این گواهی در سیستم شما نصب می‌شود:
dotnet dev-certs https --clean
dotnet dev-certs https --trust
این گواهی جدید، علاوه بر localhost، ورودی‌های DNS اضافی دیگری نیز دارد: .dev.localhost، *.dev.internal، host.docker.internal و host.containers.internal.
ویژگی جدید دات‌نت ۱۰ به شما اجازه می‌دهد تا برنامه‌های محلی خود را با یک نام دامنه منحصر به فرد اجرا کنید، به شرطی که به یکی از این دامنه‌ها ختم شود.

استفاده از دامنه‌های منحصر به فرد محلی

برای بهره‌برداری از این ویژگی، کافی است فایل launchSettings.json برنامه خود را به‌روز کنید تا از زیردامنه‌های dev.localhost استفاده کند.
برای برنامه اول:
"https": {
  "commandName": "Project",
  "dotnetRunMessages": true,
  "launchBrowser": true,
  "applicationUrl": "https://cookiejarsone.dev.localhost:7014", 
  // نام دامنه منحصر به فرد
  "environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Development"
  }
}

برای برنامه دوم:
"https": {
  "commandName": "Project",
  "dotnetRunMessages": true,
  "launchBrowser": true,
  "applicationUrl": "https://cookiejarstwo.dev.localhost:7128", 
  // نام دامنه منحصر به فرد دیگر
  "environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Development"
  }
}
با اجرای این تنظیمات، هر برنامه روی یک دامنه منحصر به فرد اجرا می‌شود. در نتیجه، کوکی‌ها به درستی برای همان برنامه ایزوله می‌شوند و مشکل تداخل کوکی‌ها که در localhost رخ می‌داد، به طور کامل از بین می‌رود. در ابزارهای توسعه مرورگر، خواهید دید که مقدار Domain کوکی‌ها با دامنه منحصر به فرد برنامه مطابقت دارد (مثلاً cookiejarsone.dev.localhost).

نکته‌ای که فراموش نشد: شبیه‌سازی DNS محلی (Host File)

یک نکته مهم که باید برای غنی‌سازی بحث اضافه شود، این است که در گذشته، توسعه‌دهندگان برای شبیه‌سازی دامنه‌های منحصر به فرد محلی، مجبور بودند به صورت دستی فایل Hosts سیستم عامل خود را ویرایش کنند (مثلاً در ویندوز مسیر C:\Windows\System32\drivers\etc\hosts) و برای هر برنامه یک ورودی به شکل زیر اضافه می‌کردند:
127.0.0.1    myapp1.local
127.0.0.1    myapp2.local
این کار:
  • دستی و پرهزینه بود: با افزایش تعداد پروژه‌ها، مدیریت این فایل دشوار می‌شد.
  • نیاز به گواهی TLS داشت: هر توسعه‌دهنده باید گواهی‌های TLS جداگانه برای هر دامنه ساختگی (مثل myapp1.local) تولید و Trust می‌کرد، که فرآیندی پیچیده بود.
مزیت بزرگ دات‌نت ۱۰ این است که دامنه .dev.localhost و سایرین از طریق سیستم DNS محلی به 127.0.0.1 هدایت می‌شوند و مهم‌تر از آن، گواهی توسعه‌دهنده جدید از پیش برای این دامنه‌ها صادر و Trust شده است، در نتیجه نیاز به ویرایش دستی فایل Hosts و مدیریت پیچیده گواهی‌ها کاملاً حذف می‌شود. این سهولت استفاده، اعتماد به نفس توسعه‌دهندگان را در شبیه‌سازی دقیق‌تر محیط تولید به شدت بالا می‌برد.

اهمیت این ویژگی

این به‌روزرسانی در گواهی توسعه‌دهنده، گرچه ممکن است در مقایسه با سایر تغییرات دات‌نت ۱۰ کوچک به نظر برسد، اما یک گام حیاتی برای توسعه‌دهندگان ASP.NET Core است، به ویژه برای کسانی که با احراز هویت و امنیت کار می‌کنند (مثل استفاده از Duende IdentityServer یا فریمورک‌های Backend for Frontend).
بسیاری از سازوکارهای احراز هویت، مانند OpenID Connect و OAuth 2.0، و فریمورک‌های امنیتی بر پایه کوکی‌ها کار می‌کنند. ایزوله‌سازی صحیح کوکی‌ها در محیط توسعه، تضمین می‌کند که منطق امنیتی که به صورت محلی آزمایش می‌شود، دقیقاً همان‌طور که انتظار می‌رود در محیط‌های Staging و Production نیز عمل کند.
توصیه می‌شود که تمام توسعه‌دهندگان ASP.NET Core، به‌روزرسانی به دات‌نت ۱۰ و تنظیم فایل launchSettings.json پروژه‌های خود برای استفاده از دامنه‌های .dev.localhost را در اولویت قرار دهند. این کار یک عامل بالقوه سردرگم‌کننده را از فرآیند توسعه شما حذف کرده و استقرار پروژه‌ها را قابل پیش‌بینی‌تر می‌سازد.


مشاهده مطلب اصلی