🔐 ذخیرهسازی امن اسرار برنامه در محیط توسعه در ASP.NET Core
این مقاله توضیح میدهد که چگونه دادههای حساس را برای یک اپلیکیشن ASP.NET Core روی یک ماشین توسعه مدیریت کنید. هرگز پسوردها یا دیگر دادههای حساس را در سورس کد یا فایلهای پیکربندی ذخیره نکنید. اسرار محیط پروداکشن نباید برای توسعه یا تست استفاده شوند. اسرار نباید همراه با اپلیکیشن دیپلوی شوند. اسرار پروداکشن باید از طریق ابزارهای کنترلشده مانند Azure Key Vault 🔑 قابل دسترسی باشند.
متغیرهای محیطی (Environment variables) 🌍
متغیرهای محیطی برای جلوگیری از ذخیرهسازی اسرار برنامه در کد یا فایلهای کانفیگ محلی استفاده میشوند. متغیرهای محیطی، مقادیر پیکربندی را برای تمام منابع پیکربندی که قبلاً مشخص شدهاند، بازنویسی (override) میکنند.
⚠️ هشدار
متغیرهای محیطی معمولاً به صورت متن ساده و رمزنگارینشده ذخیره میشوند. اگر ماشین یا فرآیند به خطر بیفتد، متغیرهای محیطی میتوانند توسط افراد غیرقابل اعتماد قابل دسترسی باشند.
جداکننده : با کلیدهای سلسلهمراتبی متغیرهای محیطی روی همه پلتفرمها کار نمیکند (مثلاً Bash از آن پشتیبانی نمیکند). اما آندرلاین دوتایی (__):
✅ توسط همه پلتفرمها پشتیبانی میشود.
✅ به طور خودکار با یک کالن (:) جایگزین میشود.
ابزار Secret Manager 🕵️♂️
ابزار Secret Manager دادههای حساس را در طول توسعه اپلیکیشن ذخیره میکند. در این زمینه، یک داده حساس، یک سرّ برنامه (app secret) است. اسرار برنامه در مکانی جدا از درخت پروژه ذخیره میشوند و به یک پروژه خاص مرتبط هستند. اسرار برنامه به سورس کنترل چکاین نمیشوند.
⚠️ هشدار
ابزار Secret Manager اسرار ذخیره شده را رمزنگاری نمیکند و نباید به عنوان یک مخزن قابل اعتماد در نظر گرفته شود. این ابزار فقط برای اهداف توسعه است. کلیدها و مقادیر در یک فایل کانفیگ JSON در پوشه پروفایل کاربر ذخیره میشوند.
نحوه کار ابزار Secret Manager 🪄
این ابزار جزئیات پیادهسازی مانند مکان و نحوه ذخیره مقادیر را پنهان میکند. مقادیر در یک فایل JSON در پوشه پروفایل کاربر ماشین محلی ذخیره میشوند:
Windows: 📁 %APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.json
Linux / macOS: 📁 ~/.microsoft/usersecrets/<user_secrets_id>\secrets.json
کدی ننویسید که به مکان یا فرمت دادههای ذخیره شده با Secret Manager وابسته باشد.
فعال کردن ذخیرهسازی اسرار
از طریق CLI: ❯
در پوشه پروژه، دستور زیر را اجرا کنید:
dotnet user-secrets init
این دستور یک عنصر UserSecretsId به فایل csproj. شما اضافه میکند.
از طریق ویژوال استودیو: 🖱️
در Solution Explorer، روی پروژه راستکلیک کرده و Manage User Secrets را انتخاب کنید.
تنظیم یک سرّ ✍️
یک سرّ از یک کلید و مقدار تشکیل شده است. برای تنظیم آن، از دستور set استفاده کنید:
dotnet user-secrets set "Movies:ServiceApiKey" "12345"
کالن (:) در اینجا نشان میدهد که Movies یک آبجکت با پراپرتی ServiceApiKey است.
دسترسی به یک سرّ 📖
1️⃣ ثبت منبع پیکربندی User Secrets:
در اپلیکیشنهای وب مدرن ASP.NET Core، WebApplication.CreateBuilder(args) به صورت خودکار AddUserSecrets را در محیط Development فراخوانی میکند.
2️⃣ خواندن سرّ از طریق Configuration API: ⚙️
شما میتوانید اسرار را دقیقاً مانند مقادیر appsettings.json از طریق IConfiguration بخوانید.
var builder = WebApplication.CreateBuilder(args);
var movieApiKey = builder.Configuration["Movies:ServiceApiKey"];
var app = builder.Build();
app.MapGet("/", () => movieApiKey);
app.Run();
مثال در یک Page Model:
public class IndexModel : PageModel
{
private readonly IConfiguration _config;
public IndexModel(IConfiguration config)
{
_config = config;
}
public void OnGet()
{
var moviesApiKey = _config["Movies:ServiceApiKey"];
// ...
}
}