إدارة الأسرار
خزّنوا الأسرار بأمان باستخدام .NET User Secrets أثناء التطوير، وAzure Key Vault أو متغيرات البيئة في الإنتاج.
إدارة الأسرار درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
الأسرار ليست إعدادات
يجب ألا تُخزَّن كلمات المرور ومفاتيح API وسلاسل الاتصال ومفاتيح توقيع JWT مطلقًا في appsettings.json أو تُودَع في نظام التحكم بالمصدر. ويوفر .NET عدة آليات مخصصة لإدارة الأسرار.
User Secrets (التطوير)
تخزّن User Secrets أسرار التطوير خارج مجلد المشروع في ملف محلي على الجهاز. وتُحمَّل تلقائيًا في بيئة Development، ولا تنتقل مطلقًا مع الشيفرة المصدرية.
# Initialize (adds UserSecretsId to .csproj):
dotnet user-secrets init
# Set secrets:
dotnet user-secrets set "Database:Password" "dev-pass-123"
dotnet user-secrets set "Jwt:SigningKey" "dev-jwt-key-abc"
dotnet user-secrets set "OpenAI:ApiKey" "sk-..."
# List / remove:
dotnet user-secrets list
dotnet user-secrets remove "OpenAI:ApiKey"
# Stored at:
# macOS/Linux: ~/.microsoft/usersecrets/{id}/secrets.json
# Windows: %APPDATA%\Microsoft\UserSecrets\{id}\secrets.jsonتحميل User Secrets صراحةً
يحمّل Host.CreateApplicationBuilder User Secrets تلقائيًا في بيئة Development. ويمكنك أيضًا تحميلها صراحةً للسيناريوهات غير التابعة لبيئة Development أو لمشاريع الاختبار.
var builder = Host.CreateApplicationBuilder(args);
// Automatic (Development only) — already done by default
// Equivalent manual call:
if (builder.Environment.IsDevelopment())
builder.Configuration.AddUserSecrets<Program>();
// In test projects (no ASPNETCORE_ENVIRONMENT):
var config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: true)
.AddUserSecrets<Program>() // loads secrets.json
.AddEnvironmentVariables()
.Build();متغيرات البيئة للإنتاج
في بيئة الإنتاج، احقن الأسرار كمتغيرات بيئة — إذ تُقرأ من نظام التشغيل أو منسّق الحاويات أثناء التشغيل، ولا تُحفظ كنص واضح على القرص بجوار الشيفرة.
# docker-compose.yml — inject secrets:
services:
api:
image: myapp:latest
environment:
- Database__Password=${DB_PASSWORD} # from .env file
- Jwt__SigningKey=${JWT_KEY}
- ConnectionStrings__Default=Server=db;Password=${DB_PASSWORD}
# Kubernetes Secret:
kubectl create secret generic app-secrets \
--from-literal=Database__Password=secret123 \
--from-literal=Jwt__SigningKey=verylongkey
# Reference in pod spec:
# env:
# - name: Database__Password
# valueFrom:
# secretKeyRef: { name: app-secrets, key: Database__Password }التكامل مع Azure Key Vault
يُعد Azure Key Vault مخزن أسرار مُدارًا لبيئة الإنتاج. ويحمّل الموفّر الرسمي الأسرار مباشرةً إلى نظام الإعدادات — ويقرأها تطبيقك مثل أي قيمة إعدادات أخرى.
// dotnet add package Azure.Extensions.AspNetCore.Configuration.Secrets
// dotnet add package Azure.Identity
var builder = WebApplication.CreateBuilder(args);
if (!builder.Environment.IsDevelopment())
{
var kvUri = new Uri(builder.Configuration["Azure:KeyVaultUri"]!);
// Uses Managed Identity / workload identity in production:
builder.Configuration.AddAzureKeyVault(kvUri, new DefaultAzureCredential());
}
// Secrets named "Database--Password" in Key Vault
// are accessible as builder.Configuration["Database:Password"]
// (Key Vault uses -- as the : separator)AWS Secrets Manager
في AWS، استخدم Amazon.Extensions.Configuration.SystemsManager أو Secrets Manager مباشرةً لحقن الأسرار في مسار إعدادات .NET.
// dotnet add package Amazon.Extensions.Configuration.SystemsManager
builder.Configuration.AddSystemsManager(
path: "/myapp/production", // parameter store prefix
optional: false,
reloadAfter: TimeSpan.FromMinutes(30));
// Or Secrets Manager directly:
using Amazon.SecretsManager;
using Amazon.SecretsManager.Model;
var client = new AmazonSecretsManagerClient();
var response = await client.GetSecretValueAsync(new GetSecretValueRequest
{
SecretId = "myapp/production/db-password"
});
var secret = response.SecretString; // JSON string
// Parse and inject into configHashiCorp Vault
يوفر HashiCorp Vault أسرارًا ديناميكية وتدويرًا للأسرار وتحكمًا دقيقًا في الوصول. استخدم مكتبة المجتمع VaultSharp أو موفّر إعدادات للتكامل مع .NET.
// dotnet add package VaultSharp
using VaultSharp;
using VaultSharp.V1.AuthMethods.Token;
var authMethod = new TokenAuthMethodInfo("vault-token");
var vaultClient = new VaultClient(
new VaultClientSettings("https://vault.example.com:8200", authMethod));
// Read a secret:
var kv = await vaultClient.V1.Secrets.KeyValue.V2
.ReadSecretAsync(path: "myapp/database", mountPoint: "secret");
var password = kv.Data.Data["password"].ToString();
// Then store in configuration or pass to IOptions:
builder.Configuration["Database:Password"] = password;حماية الأسرار في الذاكرة
حتى في الذاكرة، ينبغي التعامل مع الأسرار بحذر. استخدم SecureString أو حدّد نطاقها باستخدام كتل using، وتجنب تسجيل قيم الأسرار.
// NEVER log secrets:
_logger.LogInformation("API Key: {Key}", apiKey); // WRONG!
_logger.LogInformation("API Key configured: {HasKey}", !string.IsNullOrEmpty(apiKey)); // CORRECT
// Mask in diagnostics:
public string KeyHint => apiKey.Length > 8
? $"{apiKey[..4]}...{apiKey[^4..]}"
: "****";
// Scope the secret:
void ProcessWithSecret()
{
var secret = LoadSecret();
try { UseSecret(secret); }
finally { secret = string.Empty; } // clear reference
}الأسرار في CI/CD
توفر مسارات CI/CD، مثل GitHub Actions وAzure DevOps وJenkins، مخازن لمتغيرات الأسرار. احقن الأسرار كمتغيرات بيئة عند الإنشاء أو النشر — ولا تضعها ثابتةً في YAML الخاص بالمسار مطلقًا.
# GitHub Actions — store in Settings > Secrets:
# name: Deploy
# on: push
# jobs:
# deploy:
# runs-on: ubuntu-latest
# env:
# Database__Password: ${{ secrets.DB_PASSWORD }}
# Jwt__SigningKey: ${{ secrets.JWT_KEY }}
# steps:
# - name: Run migration
# run: dotnet ef database update
# Azure Pipelines:
# variables:
# - group: my-app-secrets # from Azure DevOps Variable Group
# The secrets are masked in logs and never stored in plaintextتطبيق عملي: استراتيجية أسرار التطوير والإنتاج
استراتيجية متكاملة للأسرار: استخدام User Secrets في التطوير وAzure Key Vault في الإنتاج، مع متغيرات البيئة كخيار احتياطي.
var builder = WebApplication.CreateBuilder(args);
if (builder.Environment.IsDevelopment())
{
// Dev: local secrets.json, never committed
builder.Configuration.AddUserSecrets<Program>();
}
else
{
// Production: Azure Key Vault via Managed Identity
var kvUri = builder.Configuration["Azure:KeyVaultUri"];
if (!string.IsNullOrEmpty(kvUri))
builder.Configuration.AddAzureKeyVault(
new Uri(kvUri), new DefaultAzureCredential());
}
// Always load env vars (works in all environments + containers):
// Already loaded by CreateBuilder — they override Key Vault
// Bind secrets to strongly typed options:
builder.Services
.AddOptions<JwtOptions>()
.BindConfiguration("Jwt")
.ValidateDataAnnotations()
.ValidateOnStart();تحقق سريع
لماذا يجب ألا تُخزَّن الأسرار مطلقًا في appsettings.json؟
مراجعة: إدارة الأسرار
أهم النقاط:
- لا تخزّن الأسرار مطلقًا في
appsettings.json— إذ يُودَع في نظام التحكم بالمصدر - التطوير: استخدم User Secrets (
dotnet user-secrets) — وتُخزَّن خارج المشروع - الإنتاج: متغيرات البيئة أو Azure Key Vault أو AWS Secrets Manager أو HashiCorp Vault
- CI/CD: خزّن الأسرار في مخزن أسرار المسار، واحقنها كمتغيرات بيئة
- لا تسجّل قيم الأسرار الخام مطلقًا؛ استخدم تلميحات أو أقنعة
- اجمع بين الاستراتيجيات: User Secrets في التطوير وKey Vault في الإنتاج ومتغيرات البيئة للتجاوز
الأسئلة الشائعة
هل درس «إدارة الأسرار» مجاني؟
نعم — نص درس «إدارة الأسرار» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «إدارة الأسرار»؟
خزّنوا الأسرار بأمان باستخدام .NET User Secrets أثناء التطوير، وAzure Key Vault أو متغيرات البيئة في الإنتاج. تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «إدارة الأسرار»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مصادر الإعداد وموفّروه
- الخيارات محدّدة الأنواع باستخدام IOptions
- التحقق من الخيارات والخيارات المسمّاة
- إدارة الأسرار