使用驗證來存取位於本地的 Python 應用程式中 Azure 的資源

託管於 Azure 之外的應用程式,例如在本地部署或第三方資料中心的應用程式,應透過 Microsoft Entra ID 的應用程式服務主體來對 Azure 服務進行身份驗證。 在前面的章節中,您將學習:

  • 如何向 Microsoft Entra 註冊應用程式以建立服務主體
  • 如何將角色指派給權限範圍
  • 如何從應用程式程式代碼使用服務主體進行驗證

使用專用的應用程式服務主體,可以讓你在存取 Azure 資源時遵守最小權限原則。 權限僅限於開發過程中應用程式的特定需求,防止誤入其他應用程式或服務的 Azure 資源。 這種方法也有助於避免當應用程式移至生產環境時發生問題,確保應用程式在開發環境中不會被過度授予權限。

應該為裝載應用程式所在的每個環境建立不同的應用程式註冊。 這讓每個服務主體都能設定環境專屬的資源權限,並確保部署到一個環境的應用程式不會與另一個環境的 Azure 資源溝通。

喺 Azure 註冊應用程式

應用程式服務主體物件是透過在 Azure 的應用程式註冊,使用 Azure 入口網站或 Azure CLI 來建立。

  1. 在Azure入口網站,使用搜尋欄導航至App registrations頁面。

  2. 在App registrations頁面,選擇+新註冊。

  3. 在 註冊應用程式 頁面上:

    • 針對 [名稱] 字段,輸入包含應用程式名稱和目標環境的描述性值。
    • 針對 支援的帳戶類型,請選取 僅限此組織目錄內的帳戶(僅限 Microsoft 客戶導向 - 單一租戶)或是最符合您需求的選項。
  4. 選取 [] 註冊 [] 以註冊您的應用程式並建立服務主體。

    一張顯示如何在Azure入口網站建立應用程式註冊的截圖。

  5. 在應用程式的 [應用程式註冊] 頁面上,複製 應用程式識別碼 和 目錄(租使用者)標識碼 並貼到暫存位置,以供稍後在應用程式程式代碼組態中使用。

  6. 選取 [[新增憑證或秘密],以設定應用程式的認證。

  7. 在 [憑證 & 秘密] 頁面上,選取 [+ 新增客戶端密碼]。

  8. 在開啟的 [新增客戶端密碼 浮出視窗] 中:

    • 針對 [描述],輸入 Current 的值。
    • 針對 Expires 值,保留建議的預設值 180 天。
    • 選取 ,然後添加 以增加秘密。
  9. 在 [憑證 & 秘密] 頁面上,複製用戶端密碼的 Value 屬性,以供日後步驟使用。

    備註

    客戶端密碼值只會在建立應用程式註冊之後顯示一次。 您可以新增更多客戶端密碼,而不會使此客戶端密碼失效,但無法再次顯示此值。

將角色指派給應用程式服務主體

接著,確定你的應用程式需要哪些角色(權限)和哪些資源,並將這些角色指派給你建立的服務主體。 角色可在資源、資源群組或訂閱範圍分配。 這個範例展示了如何在資源群組範圍內指派角色,因為大多數應用程式會將所有 Azure 資源分組到單一資源群組。

  1. 在Azure入口網站中,前往包含你應用程式的資源群組的 Overview頁面。

  2. 從左側導覽中選擇 存取控制(IAM)。

  3. 在 [存取控制 (IAM)] 頁面上,選取 [+ 新增],然後從下拉選單中選擇 [新增角色指派]。 新增 角色指派 頁面提供數個索引標籤來設定和指派角色。

  4. 在 [ 角色 ] 索引標籤上,使用搜尋方塊來尋找您要指派的角色。 選取角色,然後選擇 下一步。

  5. 在 「成員」 標籤上:

    • 針對 [指派存取權] 值,選取 [使用者、群組或服務主體] 。
    • 針對 [成員] 值,選擇 [+ 選取成員] 以開啟 [選取成員] 彈出面板。
    • 搜尋你先前建立的服務主體,從篩選結果中選擇它。 選擇 選擇 以選擇群組,然後關閉彈出面板。
    • 請在 成員 索引標籤的底部選取 檢閱 + 指派。

    一張顯示如何將角色指派給服務主體的截圖。

  6. 在 [ 檢閱 + 指派 ] 索引標籤上,選取頁面底部的 [ 檢閱 + 指派 ]。


設定應用程式環境變數

執行時,Azure身份函式庫中的某些憑證,如DefaultAzureCredential、EnvironmentCredential 和 ClientSecretCredential,依照慣例在環境變數中搜尋服務主體資訊。 使用 Python 時,根據你的工具和環境,有多種設定環境變數的方法。

無論您選擇何種方法,請為服務主體設定下列環境變數:

  • AZURE_CLIENT_ID:用於識別Azure中註冊的應用程式。
  • AZURE_TENANT_ID:Microsoft Entra 租戶的識別碼。
  • AZURE_CLIENT_SECRET:為應用程式產生的秘密認證。

在 Visual Studio Code 中,環境變數可以在專案的 launch.json 資料夾中的 .vscode 檔案中設定。 這些值會在應用程式啟動時自動提取。 不過,這些設定不會在部署期間隨您的應用程式一起移動,因此您必須在目標裝載環境上設定環境變數。

{
    "configurations": [
        {
            "env": {
                "AZURE_CLIENT_ID": "<your-client-id>",
                "AZURE_TENANT_ID": "<your-tenant-id>",
                "AZURE_CLIENT_SECRET": "<your-client-secret>"
            }
        }
    ]
}

從你的應用程式認證到 Azure 服務

azure-identity函式庫提供多種認證憑證——TokenCredential實作,適用於支援不同情境及Microsoft Entra認證流程。 接下來的步驟將示範如何在本地及生產環境中與服務主體合作時使用 ClientSecretCredential 。

實作程式碼

首先將套件加入你的應用程式。

pip install azure-identity

接著,對於任何在應用程式中建立 Azure SDK 客戶端物件的 Python 程式碼,你應該:

  1. 從模組匯入 ClientSecretCredentialazure.identity 類別。
  2. 匯入 os 模組以讀取環境變數。
  3. 讀取環境變數以取得用戶端 ID、租戶 ID 和用戶端秘密。
  4. 建立 ClientSecretCredential 一個物件,傳遞租戶 ID、客戶端 ID 和客戶端秘密。
  5. 將 ClientSecretCredential 物件傳給 Azure SDK 用戶端物件建構子。

此方法的範例顯示在下列程式碼區段中。

import os
from azure.identity import ClientSecretCredential
from azure.storage.blob import BlobServiceClient

tenant_id = os.environ.get("AZURE_TENANT_ID")
client_id = os.environ.get("AZURE_CLIENT_ID")
client_secret = os.environ.get("AZURE_CLIENT_SECRET")

credential = ClientSecretCredential(tenant_id, client_id, client_secret)

blob_service_client = BlobServiceClient(
    account_url="https://<my_account_name>.blob.core.windows.net",
    credential=credential)