ما در مطلب قبلی به نحوه استفاده از متغیرهای محیطی (environment variables) برای نگه داشتن اطلاعات حساس خارج از کد نگاه کردیم. ابزار Secret Manager راه دیگری برای ذخیره اطلاعات سری، خارج از پروژه و دسترسی به آنها از طریق کلاس configuration است. برخلاف متغیرهای محیطی، این امکان فقط برای زمان توسعه و پیاده سازی استفاده می شود.
اولین قدم نصب Secret Manager با ویرایش فایل پروژه Roux Academy است.
ما یک عنصر ItemGroup جدیدی به شکل زیراضافه می کنیم.
<itemgroup>
<dotnetclitoolreference include="Microsoft.Extensions.SecretManager.Tools" version="1.0.0-msbuild3-final">
</dotnetclitoolreference>
</itemgroup>
سپس روی پروژه کلیک راست کرده و Manage User Secrets را انتخاب کنید.
این فایل Secrets.json جایی است که می توانید اطلاعات حساس را به عنوان جفت مقادیر کلیدی ذخیره کنید. آنها در دستگاه محلی شما در پوشه مشخصات کاربر ذخیره می شوند.
بیایید یک ورودی برای رمز عبور مورد نظر خودمان اضافه کنیم. و من به آن یک مقدار رمز عبور غیر واقعی می دهم.
{
"PaymentProcessorPassword" : "pmtp@$$w0rd"
}
بیایید به فایل پروژه برگردیم و می بینیم که یک عنصر UserSecretsId اضافه شده است. این یک GUID منحصر به فرد است که مشخص می کند Secrets به کدام برنامه تعلق دارد.
ما باید بتوانیم با استفاده از امکانات configuration به این اطلاعات سری دسترسی داشته باشیم. برای انجام این کار، باید یک بسته NuGet را برای User Secrets نصب کنیم. پیش بروید و بسته Microsoft.Extensions.Configuration.UserSecrets را جستجو کنید و ما آن را در پروژه Roux Academy نصب می کنیم.
سپس، در سازنده کلاس startup باید ارائه دهنده پیکربندی User Secrets را اضافه کنیم.
از آنجایی که این فقط برای محیط توسعه اعمال می شود، آن را در یک عبارت شرطی قرار می دهیم.
و سپس User Secrets را اضافه می کنیم.
if (env.IsDevelopment())
{
builder.AddUserSecrets<Startup>();
}
از آنجا که این اطلاعات آخرین تنظیماتی هست که بارگذاری می شوند، تنظیمات و اطلاعات داخل فایل Secrets.json هر گونه تنظیمات را از منابع پیکربندی دیگر لغو می کند و اطلاعات درون آنها جایگزین اطلاعات سابق می شود. ما می توانیم اطلاعات سری خود را با استفاده از همین روال استاندارد خواندن اطلاعات پیکربندی بخوانیم. اجازه دهید به شما نشان دهم که چگونه در متد ConfigureServices این کار را انجام می دهیم.
ما یک متغیر به نام secret را تعریف می کنیم و از همان آبجکت Configuration با استفاده از کلیدی که در فایل Secrets خود تعریف کرده ایم استفاده می کنیم.
var secret = Configuration["PaymentProcessorPassword"];
و این تمام چیزی است که برای خواندن مقدار سری نیاز دارید.
با استفاده از Secret Manager، از افشای اطلاعات حساس توسعه در کد و سیستم کنترل سورس برنامه اجتناب می کنیم.