البرنامج التعليمي: إعداد هوية مدارة لتوصيل 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 عبر الويب والنشر المقدم في هذا البرنامج التعليمي، راجع:
- نظرة عامة على App Service
- إنشاء تطبيق ويب ASP.NET Core في Azure App Service
- نشر Git المحلي في Azure App Service
المتطلبات الأساسية
لإكمال هذا البرنامج التعليمي، تحتاج إلى:
- اشتراك Azure. أنشئ حسابًا مجانًا.
- NET Core 3.1 SDK (أو الإصدار الأحدث).
- تثبيت Git بإصدار 2.28.0 أو ما هو أحدث.
- تثبيت Azure CLI أو Azure PowerShell.
- Azure Key Vault. يمكنك إنشاء key vault باستخدام مدخل Microsoft Azureأو Azure CLI أو Azure PowerShell.
- A Key Vault سر. يمكن إنشاء سر باستخدام مدخل Microsoft Azure أو Azure CLI أو Azure PowerShell.
إذا نُشر بالفعل تطبيق الويب الخاص بك في 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"
}
لمنح أذونات التطبيق إلى مخزن المفاتيح الخاص بك من خلال التحكم في الوصول استنادا إلى الدور (RBAC)، قم بتعيين دور باستخدام الأمر Azure CLI az role assignment create.
az role assignment create --role "Key Vault Secrets User" --assignee "<app-id>" --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.KeyVault/vaults/<your-unique-keyvault-name>"
استبدل <app-id>
و <resource-group-name>
<subscription-id>
و <your-unique-keyvault-name>
بقيمك الفعلية. <app-id>
هو معرف التطبيق (العميل) للتطبيق المسجل في Microsoft Entra.
تعديل التطبيق للوصول إلى 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
والذي ينبغي أن ترى فيه، قبل أن ترى نافذة "مرحباً بالعالم!" ، قيمة معروضاتك السرية.