تمرين - تكوين تطبيق ويب Azure باستخدام ConfigurationBuilder

مكتمل

في نظام التجارة الإلكترونية، من المهم تجنب كشف المفاتيح التي يستخدمها المستودع للاتصال بقاعدة بيانات خادم SQL. قد يؤدي الفشل هنا إلى اختراق قاعدة البيانات وتلف المعلومات القيمة بها أو تعديلها بطريقة لا يوجد تخويل بها.

في هذه الوحدة، تخزن سلسلة اتصال خادم SQL في مخزن مفاتيح Azure الخاص بك. مخزن المفاتيح هو مستودع آمن يستخدم معرف Microsoft Entra لمصادقة المستخدمين وتخويلهم. لإتاحة سلسلة الاتصال لتطبيق الويب فقط، تُحدد أن العميل الذي يحاول استرداد السلسلة يجب أن يعمل مع مبدأ خدمة تطبيق الويب. وأخيرا، انشر تطبيق ويب المستودع إلى تطبيق ويب Azure App Service الذي أنشأته سابقا، وتحقق من أنه لا يزال يعمل بشكل صحيح.

إنشاء مخزن مفاتيح Azure وتخزين سلسلة الاتصال

  1. في نافذة Cloud Shell على اليمين، لتحديد متغير PowerShell الذي يحتوي على اسم مخزن المفاتيح الذي سيتم إنشاؤه، شغّل الأمر التالي:

    $vaultname = (-join("shopvault", $useralias))
    
  2. إنشاء مخزن مفاتيح Azure.

    New-AzKeyVault `
        -Name $vaultname `
        -ResourceGroupName $resourcegroupname `
        -location $location 
    

    عند إنشاء key vault، تتلقى التحذير التالي:

    WARNING: Access policy is not set. No user or application have access permission to use this vault. This can happen if the vault was created by a service principal. Please use Set-AzKeyVaultAccessPolicy to set access policies.
    
  3. استرداد مُعرِّف كيان الخدمة لتطبيق الويب.

    $appId=(Get-AzWebApp `
        -ResourceGroupName $resourcegroupname `
        -Name $webappname).Identity.PrincipalId
    
  4. تعيين نهج الوصول الخاص بمخزن المفاتيح للسماح لتطبيق الويب، الذي تحدده باستخدام كيان الخدمة، بالوصول إلى مخزن المفاتيح.

    Set-AzKeyVaultAccessPolicy `
        -VaultName $vaultname `
        -ResourceGroupName $resourcegroupname `
        -ObjectId $appId `
        -PermissionsToSecrets Get `
        -BypassObjectIdValidation
    
  5. إنشاء سلسلة الاتصال لقاعدة بيانات خادم SQL باستخدام متغيرات PowerShell التي أنشأتها مسبقاً.

    $connectionstringplaintext = `
        (-join("Server=tcp:", $servername, ".database.windows.net,1433;Database=", `
        $dbname, ";User ID=", $serveradminname, ";Password=", $serveradminpassword, `
        ";Encrypt=true;Connection Timeout=30;"))
    
  6. تحويل سلسلة الاتصال إلى سلسلة آمنة.

    $connectionstring = ConvertTo-SecureString $connectionstringplaintext `
        -AsPlainText `
        -Force
    

    إشعار

    السلسلة الآمنة هي كائن سلسلة يمكن الاحتفاظ به مرة واحدة فقط في الذاكرة. لا يمكن نسخها في مكان آخر في الذاكرة. تساعد هذه الميزة على الحد من الثغرة الأمنية للمعلومات الموجودة في السلسلة تجاه الهجمات التي تحاول فحص ونسخ كتل من الذاكرة والبحث عن كلمات المرور وغيرها من المعلومات الحساسة.

  7. ابحث عن معرف الكائن لحسابك في معرف Microsoft Entra.

    $objectId = az ad signed-in-user show `
        --query id -o tsv
    
  8. منح الحساب الخاص بك الامتيازات لإنشاء الأسرار والمفاتيح واستردادها من مخزن المفاتيح.

    Set-AzKeyVaultAccessPolicy `
        -VaultName $vaultname `
        -PermissionsToKeys create,decrypt,delete,encrypt,get,list,unwrapKey,wrapKey `
        -PermissionsToSecrets get,list,set,delete `
        -ObjectId $objectId
    
  9. تخزين السلسلة الآمنة في مخزن المفاتيح باستخدام مفتاح CatalogDBContext.

    Set-AzKeyVaultSecret `
        -VaultName $vaultname `
        -Name "CatalogDBContext" `
        -SecretValue $connectionstring 
    
  10. تحقق من تخزين سر CatalogDBContext في مخزن المفاتيح.

    Get-AzKeyVaultSecret `
        -VaultName $vaultname `
        -Name "CatalogDBContext"
    
  11. ضبط اسم المخزن كـ AppSetting يسمى KeyVaultName لتطبيق الويب. يقوم هذا الإعداد بتكوين التطبيق لاسترداد اسم مخزن المفاتيح.

    Set-AzWebApp `
        -Name $webappname `
        -ResourceGroupName $resourcegroupname `
        -AppSettings @{KeyVaultName = $vaultname}
    

تكوين تطبيق الويب

  1. قم بالتبديل إلى Visual Studio على جهاز الكمبيوتر الخاص بك، والعودة إلى حل eShopLegacyWebForms الذي يحتوي على تطبيق الويب.

  2. في قائمة "Tools"، حدد "NuGet Package Manager"، ثم حدد "Package Manager Console".

  3. في نافذة وحدة التحكم مدير الحِزَم، قم بتشغيل الأمر التالي لتثبيت مكتبة ConfigurationBuilder. المكتبة مطلوبة لقراءة البيانات السرية من مخزن مفاتيح Azure.

    Install-Package Microsoft.Configuration.ConfigurationBuilders.Azure -Version 2.0.0
    
  4. في نافذة "Solution Explorer"، حدد ملف "Web.config". لاحظ أن <قسم configBuilders> تمت إضافته الآن إلى هذا الملف.

    <configuration>
      <configSections>
        ...
      </configSections>
      <configBuilders>
        <builders>
          <add name="AzureKeyVault" vaultName="[VaultName]" type="Microsoft.Configuration.ConfigurationBuilders.AzureKeyVaultConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Azure, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        </builders>
      </configBuilders>
    ...
    </configuration>
    
  5. <في قسم builders>، قم بتغيير [VaultName] إلى ${KeyVaultName} في إعداد AzureKeyVault وأضف السمة optional="true"، كما هو موضح في التعليمات البرمجية التالية. يستخدم هذا الإعداد القيمة في إعداد تطبيق KeyVaultName كاسم لمخزن المفاتيح. يمكنك إضافة إعداد التطبيق هذا قريبا.

    ...
    <builders>
      <add name="AzureKeyVault" vaultName="${KeyVaultName}" optional="true" type=... />
    </builders>
    ...
    
  6. عدّل عقدة <connectionStrings> عن طريق إضافة سمة configBuilders بقيمة AzureKeyVault، كما هو موضح في التعليمة البرمجية التالية. تمكّن هذه السمة من تكوين إعدادات التطبيق وسلاسل الاتصال باستخدام نوع ConfigurationBuilder المسمى في وقت التشغيل. في هذه الحالة، بدلا من استخدام قيمة connectionString ذات التعليمات البرمجية المضمنة في ملف التكوين، يسترد تطبيق الويب سلسلة الاتصال ل CatalogDBContext من مخزن مفاتيح Azure.

    ...
    <connectionStrings configBuilders="AzureKeyVault">
      <add name="CatalogDBContext" connectionString="..." providerName="System.Data.SqlClient" />
    </connectionStrings>
    ...
    
  7. أضف مفتاحاً فارغاً إلى قسم <appSettings>، باسم KeyVaultName. يتم استخدام مخزن المفاتيح هذا كمصدر سلسلة الاتصال. ولكن، هذا الإعداد مجرد عنصر نائب. في وقت التشغيل، يسترد تطبيق الويب القيمة من إعداد تطبيق KeyVaultName الذي حددته سابقا لتطبيق ويب Azure.

    ...
    <appSettings>
      ...
      <add key="KeyVaultName" value="" />
    </appSettings>
    ...
    

قم بتشغيل تطبيق الويب على Azure

  1. في نافذة "Solution Explorer"، وسّع مجلد "Models"، ومجلد "Infrastructure"، ثم حدد ملف dbo.catalog_brand_hilo.Sequence.sql.

    Image of the Solution Explorer window, with the

  2. في dbo.catalog_brand_hilo. Sequence.sql الملف، قم بالتعليق على عبارة USE في بداية الملف، كما هو موضح في التعليمات البرمجية التالية.

    -- USE [Microsoft.eShopOnContainers.Services.CatalogDb]
    /****** Object:  Sequence [dbo].[catalog_brand_hilo]    Script Date: 16/08/2017 11:21:49 ******/
    CREATE SEQUENCE [dbo].[catalog_brand_hilo] 
      AS [bigint]
      START WITH 1
      INCREMENT BY 10
      MINVALUE -9223372036854775808
      MAXVALUE 9223372036854775807
    CACHE 
    
  3. كرر الخطوة الثانية لملف dbo.catalog_hilo.Sequence.sql وملف dbo.catalog_type_hilo.Sequence.sql.

    إشعار

    يتم تشغيل البرامج النصية في هذه الملفات عند إضافة البيانات الأولية إلى قاعدة البيانات. تتم هذه الإضافة الأولية تلقائياً في المرة الأولى التي تشغل فيها التطبيق على قاعدة بيانات جديدة. العبارات التي علقت عليها مطلوبة فقط عندما تشغل التطبيق محلياً. عند تشغيل التطبيق باستخدام قاعدة بيانات Azure SQL Server، فإنك تحدد قاعدة البيانات التي ستستخدم كجزء من سلسلة الاتصال.

  4. إذا لم تسجل الدخول في الوقت الحالي إلى حساب Azure الخاص بك في Visual Studio، ففي الجزء العلوي الأيمن، حدد "Sign in"، ثم اتبع الإرشادات لتسجيل الدخول.

    Image of the Visual Studio toolbar, with the

  5. في نافذة "Solution Explorer"، انقر بزر الماوس الأيمن فوق مشروع "eShopLegacyWebForms"، وحدد "Publish".

    Image of the

  6. في نافذة "Pick a publish target"، حدد "App Service"، وحدد "Select Existing"، ثم حدد "Create Profile".

    Image of the

  7. في نافذة "App Service"، في القائمة المنسدلة "Subscription"، حدد اشتراك Azure الخاص بك، واضبط "View" على "Resource type"، ووسّع "Web App"، ثم حدد تطبيق ويب Azure الذي أنشأته أثناء وحدة الإعداد، ثم حدد "OK".

    Image of the

  8. في صفحة "Publish"، حدد "Publish".

    Image of the

    انتظر حتى يتم إنشاء تطبيق الويب ونشره على App Service. عند اكتمال النشر، يبدأ تطبيق الويب ويفتح Visual Studio مستعرض الويب.

  9. تحقق من أن تطبيق الويب يعمل بالطريقة نفسها التي كان يعمل بها من قبل، عندما كان يعمل محلياً. لكي يتصل تطبيق الويب بقاعدة البيانات، يجب استرداد سلسلة الاتصال من مخزن المفاتيح.

    Image of the web app running by using Azure App Service.