البرنامج التعليمي: إعداد هوية مدارة لتوصيل Key Vault بتطبيق ويب Azure في .NET

يوفر Azure Key Vault طريقة لتخزين بيانات الاعتماد والأسرار الأخرى مع زيادة الأمان. ولكن تعليماتك البرمجية تحتاج إلى المصادقة على Key Vault لاستردادها. تساعد الهويات المدارة لموارد Azure على حل هذه المشكلة من خلال منح خدمات Azure هوية مدارة تلقائيا في Microsoft Entra ID. يمكنك استخدام هذه الهوية للمصادقة على أي خدمة تدعم مصادقة Microsoft Entra، بما في ذلك Key Vault، دون الحاجة إلى عرض بيانات الاعتماد في التعليمات البرمجية الخاصة بك.

في هذا البرنامج التعليمي، تُنشئ تطبيق ويب Azure وتنشره في Azure App Service. تستخدم هوية مدارة لمصادقة تطبيق Azure على الويب من خلال Azure key vault باستخدام مكتبة العميل السريAzure Key Vault لـ .NET وAzure CLI. تنطبق نفس المبادئ الأساسية عند استخدام لغة التطوير التي تختارها وAzure PowerShell و/أو مدخل Microsoft Azure.

لمزيد من المعلومات حول تطبيقاتAzure App service عبر الويب والنشر المقدم في هذا البرنامج التعليمي، راجع:

المتطلبات الأساسية

لإكمال هذا البرنامج التعليمي، تحتاج إلى:

إذا نُشر بالفعل تطبيق الويب الخاص بك في Azure App Service، يمكنك التخطي إلى قسمي: تهيئة وصول تطبيق الويب إلى key vault وتعديل كود تطبيق الويب.

إنشاء تطبيق .NET Core

في هذه الخطوة، يمكنك إعداد المشروع المحلي .NET Core.

من النافذة النهائية على جهازك، أنشئ دليلاً باسم akvwebapp واجعله الدليل الحالي:

mkdir akvwebapp
cd akvwebapp

إنشاء تطبيق .NET Core باستخدام الأمر dotnet new web:

dotnet new web

شغل التطبيق محلياً حتى تعرف كيف ينبغي أن تبدو عند نشره إلى Azure:

dotnet run

في متصفح الويب، انتقل إلى التطبيق في http://localhost:5000.

سترى رسالة "مرحبًا بالعالم!" من نموذج التطبيق المعروض على الصفحة.

لمزيد من المعلومات حول إنشاء تطبيقات ويب لـ Azure، راجع إنشاء تطبيق ويب ASP.NET Core فيAzure App Service

توزيع التطبيق على Azure

في هذه الخطوة، تنشر تطبيق .NET Core في Azure App Service باستخدام Git المحلي. لمزيد من المعلومات حول كيفية إنشاء التطبيقات ونشرها، راجع إنشاء تطبيق ويب ASP.NET Core في Azure.

تهيئة نشر تطبيق Git المحلي

من النافذة النهائية، حدد Ctrl+C لإغلاق خادم الويب. تهيئة مستودع Git لمشروع .NET Core:

git init --initial-branch=main
git add .
git commit -m "first commit"

يمكنك استخدام FTP وGit المحلي لنشر تطبيق ويب Azure باستخدام مستخدم نشر. بعد تكوين مستخدم النشر، يمكنك استخدامه لجميع عمليات النشر المتعلقة بـ Azure. يختلف اسم مستخدم النشر وكلمة المرور على مستوى الحساب عن بيانات اعتماد اشتراك Azure.

لتكوين مستخدم النشر، شغل الأمر az webapp deployment user set. اختر اسم مستخدم وكلمة مرور يتوافقان مع هذه الإرشادات:

  • لا بد أن يكون اسم المستخدم فريداً داخل Azure. فيما يخص الدفعات المحلية من Git، لا يمكن أن تحتوي على رمز علامة (@).
  • يجب أن تحتوي كلمة المرور على ثمانية أحرف على الأقل، مع اثنين من العناصر الثلاثة التالية: الأحرف والأرقام والرموز.
az webapp deployment user set --user-name "<username>" --password "<password>"

يظهر إخراج JSON كلمة المرور كـ null. إذا واجهت خطأ 'Conflict'. Details: 409، فغير اسم المستخدم. إذا واجهت خطأ 'Bad Request'. Details: 400، فاستخدم كلمة مرور أقوى.

سجل اسم المستخدم وكلمة المرور حتى يتسنى لك استخدامهما لنشر تطبيقاتك عبر الويب.

إنشاء مجموعة موارد

تكون مجموعة موارد Azure حاوية منطقية تنشر موارد Azure وتديرها داخلها. إنشاء مجموعة موارد تحتوي على كل من Key Vault وتطبيقك عبر الويب باستخدام أمر az group create:

az group create --name "myResourceGroup" -l "EastUS"

إنشاء خطة App Service

إنشاء App Service plan باستخدام أمر Azure CLI التالي: az appservice plan create. ينشئ المثال التالي خطة App Service تُسمى myAppServicePlanفي طبقة التسعيرFREE:

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku FREE

عند إنشاء خطة App Service، يعرض Azure CLI معلومات مشابهة لما تراه هنا:

{ 
  "adminSiteName": null,
  "appServicePlanName": "myAppServicePlan",
  "geoRegion": "West Europe",
  "hostingEnvironmentProfile": null,
  "id": "/subscriptions/0000-0000/resourceGroups/myResourceGroup/providers/Microsoft.Web/serverfarms/myAppServicePlan",
  "kind": "app",
  "location": "West Europe",
  "maximumNumberOfWorkers": 1,
  "name": "myAppServicePlan",
  < JSON data removed for brevity. >
  "targetWorkerSizeId": 0,
  "type": "Microsoft.Web/serverfarms",
  "workerTierName": null
} 

لمزيد من المعلومات، راجع إدارة خطة App Service في Azure.

أنشئ تطبيق ويب

إنشاء تطبيق ويب AzureفيmyAppServicePlan خطة App Service.

هام

يتعين أن يكون اسم تطبيق ويب Azure، مثل key vault، اسماً مميزاً. استبدل <your-webapp-name> باسم تطبيقك عبر الويب في الأمثلة التالية.

az webapp create --resource-group "myResourceGroup" --plan "myAppServicePlan" --name "<your-webapp-name>" --deployment-local-git

عند إنشاء تطبيق ويب، يعرض Azure CLI مخرجاً مشابهاً لما تراه هنا:

Local git is configured with url of 'https://<username>@<your-webapp-name>.scm.azurewebsites.net/<ayour-webapp-name>.git'
{
  "availabilityState": "Normal",
  "clientAffinityEnabled": true,
  "clientCertEnabled": false,
  "clientCertExclusionPaths": null,
  "cloningInfo": null,
  "containerSize": 0,
  "dailyMemoryTimeQuota": 0,
  "defaultHostName": "<your-webapp-name>.azurewebsites.net",
  "deploymentLocalGitUrl": "https://<username>@<your-webapp-name>.scm.azurewebsites.net/<your-webapp-name>.git",
  "enabled": true,
  < JSON data removed for brevity. >
}

يظهر عنوان "URL" لبرنامج Git عن بعد في خاصية deploymentLocalGitUrl، في التنسيق https://<username>@<your-webapp-name>.scm.azurewebsites.net/<your-webapp-name>.git. حفظ عنوان URL. سوف تحتاجها لاحقًا.

الآن هيئ تطبيق الويب للنشر من الفرع main:

 az webapp config appsettings set -g MyResourceGroup --name "<your-webapp-name>" --settings deployment_branch=main

اذهب إلى تطبيقك باستخدام الأمر التالي. استبدل <your-webapp-name> باسم حسابك.

https://<your-webapp-name>.azurewebsites.net

سترى صفحة ويب الافتراضية لتطبيق Azure الجديد عبر الويب.

نشر التطبيق المحلي

سابقاً في النافذة النهائية، أضف جهاز تحكم عن بعد لـ Azure إلى مستودع Git المحلي. في الأمر التالي، استبدل <deploymentLocalGitUrl-from-create-step> بعنوان URL الخاص بجهاز التحكم عن بعد لبرنامج Git الذي حفظته في قسم Create a web app.

git remote add azure <deploymentLocalGitUrl-from-create-step>

استخدم الأمر التالي لدفع جهاز التحكم عن بعد لـ Azure لنشر تطبيقك. عندما تطالبك "إدارة بيانات اعتماد Git" ببيانات اعتمادك، استخدم بيانات الاعتماد التي أنشأتها في القسم Configure the local Git deployment.

git push azure main

ولربما يستغرق التشغيل بضع دقائق. أثناء تشغيله، يعرض معلومات مشابهة لما تراه هنا:

Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 285 bytes | 95.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Deploy Async
remote: Updating branch 'main'.
remote: Updating submodules.
remote: Preparing deployment for commit id 'd6b54472f7'.
remote: Repository path is /home/site/repository
remote: Running oryx build...
remote: Build orchestrated by Microsoft Oryx, https://github.com/Microsoft/Oryx
remote: You can report issues at https://github.com/Microsoft/Oryx/issues
remote:
remote: Oryx Version      : 0.2.20200114.13, Commit: 204922f30f8e8d41f5241b8c218425ef89106d1d, ReleaseTagName: 20200114.13
remote: Build Operation ID: |imoMY2y77/s=.40ca2a87_
remote: Repository Commit : d6b54472f7e8e9fd885ffafaa64522e74cf370e1
.
.
.
remote: Deployment successful.
remote: Deployment Logs : 'https://<your-webapp-name>.scm.azurewebsites.net/newui/jsonviewer?view_url=/api/deployments/d6b54472f7e8e9fd885ffafaa64522e74cf370e1/log'
To https://<your-webapp-name>.scm.azurewebsites.net:443/<your-webapp-name>.git
   d87e6ca..d6b5447  main -> main

انتقل إلى التطبيق المنشور(أو حدثه) باستخدام متصفح الويب:

http://<your-webapp-name>.azurewebsites.net

سترى رسالة "مرحبًا بالعالم!" التي رأيتها سابقًا عند زيارتك http://localhost:5000.

لمزيد من المعلومات حول نشر تطبيق ويب باستخدام Git، راجع النشر المحلي لـ Git في Azure App Service

تكوين تطبيق الويب للاتصال بـ Key Vault

في هذا القسم، يمكنك تكوين الوصول إلى ويب إلى Key Vault وتحديث كود التطبيق لاسترداد سر من Key Vault.

تكوين واستخدام هوية مُدارة

في هذا البرنامج التعليمي، تستخدم هوية مدارة للمصادقة على Key Vault. تدير الهوية المدارة بيانات اعتماد التطبيق تلقائياً.

في Azure CLI، لإنشاء هوية التطبيق، شغل الأمر az webapp-identity:

az webapp identity assign --name "<your-webapp-name>" --resource-group "myResourceGroup"

يُعيد الأمر قصاصة JSON:

{
  "principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "type": "SystemAssigned"
}

لمنح تطبيق الويب الإذن للقيام بـ احصل على وقائمة العمليات الموجودة في key vault، ثم مرر principalId إلى أمرAzure CLI التالي az keyvault set-policy:

az keyvault set-policy --name "<your-keyvault-name>" --object-id "<principalId>" --secret-permissions get list

يمكن أيضا تعيين سياسات وصول باستخدام بوابة Azure أو PowerShell.

تعديل التطبيق للوصول إلى key vault

في هذا البرنامج التعليمي، عليك استخدام مكتبة العميل السرية لـ Azure Key Vault لأغراض توضيحية. يمكنك أيضا استخدام مكتبة شهادة العميل في Azure Key Vault أو مكتبة مفتاح العميل في Azure Key Vault.

قم بتثبيت الحِزَم

من النافذة النهائية، ثبت مكتبة العميل السرية في Azure Key Vault، لحزم مكتبة هوية عميل Azure و.NET:

dotnet add package Azure.Identity
dotnet add package Azure.Security.KeyVault.Secrets

حدث الكود

ابحث عن ملف Startup.cs لـ .NET 5.0 أو إصدار سابق، أو ملف Program.cs لـ .NET 6.0 وافتحه في مشروع akvwebapp.

أضف هذه الأسطر إلى الرأس:

using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using Azure.Core;

أضف الأسطر التالية قبل app.UseEndpoints الاستدعاء (.NET 5.0 أو إصدار سابق) أو app.MapGet استدعاء (.NET 6.0)، وتحديث URI ليعكس vaultUri مخزن المفاتيح الخاص بك. يستخدم هذا الرمز DefaultAzureCredential() للمصادقة على Key Vault، والذي يستخدم رمزًا مميزًا من هوية مدارة للمصادقة. لمزيد من المعلومات حول مصادقة Key Vault، راجع دليل المطور. يستخدم الكود أيضاً تراجعات أسية لإعادة المحاولة في حال خنق Key Vault. لمزيد من المعلومات حول حدود معاملات Key Vault، راجع إرشادات اختناقAzure Key Vault.

SecretClientOptions options = new SecretClientOptions()
    {
        Retry =
        {
            Delay= TimeSpan.FromSeconds(2),
            MaxDelay = TimeSpan.FromSeconds(16),
            MaxRetries = 5,
            Mode = RetryMode.Exponential
         }
    };
var client = new SecretClient(new Uri("https://<your-unique-key-vault-name>.vault.azure.net/"), new DefaultAzureCredential(),options);

KeyVaultSecret secret = client.GetSecret("<mySecret>");

string secretValue = secret.Value;
‎.NET 5.0 أو إصدار سابق

تحديث السطر await context.Response.WriteAsync("Hello World!"); ليبدو مثل هذا السطر:

await context.Response.WriteAsync(secretValue);
.NET 6.0

تحديث السطر app.MapGet("/", () => "Hello World!"); ليبدو مثل هذا السطر:

app.MapGet("/", () => secretValue);

تأكد من حفظ التغييرات قبل المتابعة إلى الخطوة التالية.

إعادة نشر تطبيق الويب

والآن بعد تحديث الكود، يمكنك إعادة نشره إلى Azure باستخدام أوامر Git التالية:

git add .
git commit -m "Updated web app to access my key vault"
git push azure main

الانتقال إلى تطبيقك المكتمل عبر الويب

http://<your-webapp-name>.azurewebsites.net

والذي ينبغي أن ترى فيه، قبل أن ترى نافذة "مرحباً بالعالم!" ، قيمة معروضاتك السرية.

الخطوات التالية