共用方式為


於本機開發期間使用開發人員帳戶向 Azure 服務驗證 Python 應用程式

開發雲端應用程式時,開發人員通常會在本機建置、測試及偵錯其程式代碼,再將其部署至 Azure。 不過,即使在本機開發期間,應用程式也需要向它互動的任何 Azure 服務進行驗證,例如 Key Vault、記憶體或資料庫。

本文說明如何設定應用程式,以在本機開發期間使用開發人員的 Azure 認證進行驗證。 這種方法可讓您順暢且安全的開發體驗,而不需要內嵌秘密或撰寫環境特定邏輯。

使用開發人員帳戶進行本機開發驗證的概觀

開發使用適用於 Python 的 Azure 身分識別連結庫的應用程式時,您可以使用開發人員的 Azure 帳戶在本機開發期間向 Azure 服務進行驗證。 這種方法通常是在本機開發期間向 Azure 服務進行驗證的最簡單方式,因為它不需要建立和管理服務主體或秘密。

此圖表顯示本機開發期間 Python 應用程式如何使用開發人員的認證,從本機安裝的開發工具取得這些認證來連線到 Azure。

若要讓應用程式在使用開發人員自己的 Azure 認證進行本機開發期間向 Azure 進行驗證,開發人員必須先使用其中一個支援的命令行工具登入:

  • Azure CLI (az login
  • Azure 開發人員 CLI (azd login
  • Azure PowerShell (Connect-AzAccount

登入之後,Python 的 Azure 身份識別程式庫可以自動偵測活躍會話,並從認證快取取得必要的令牌。 這項功能可讓應用程式以登入使用者身分向 Azure 服務進行驗證,而不需要任何其他設定或硬式編碼的秘密。

使用 DefaultAzureCredential時會啟用此行為,這會以透明方式回復至本機環境中的 CLI 型認證。

使用開發人員的Azure帳戶憑證是進行本機開發最簡單的設定。 它會利用每個小組成員的現有 Azure 帳戶,在不需要額外的設定的情況下,順暢地存取 Azure 服務。

不過,開發人員帳戶通常具有比應用程式在生產環境中應擁有的更廣泛許可權。 這些更廣泛的許可權可能會導致測試不一致,或無意中允許應用程式無法在生產環境中執行的作業。 若要貼近生產環境的許可權並改善安全性狀態,您可以改為建立特定應用程式的服務物件用來進行本機開發。 這些身份:

  • 只能指派應用程式所需的角色和許可權
  • 支持最低權限原則
  • 提供一致的測試,以檢驗跨環境的存取相關行為

開發人員可以透過環境變數將本機環境設定為使用服務主體,然後 DefaultAzureCredential 會自動偵測到。 如需詳細資訊,請參閱 使用服務主體在本機開發期間向 Azure 服務驗證 Python 應用程式一文。

1 - 建立 Microsoft Entra 安全群組以進行本機開發

在大部分的開發案例中,多個開發人員都會參與相同的應用程式。 若要簡化訪問控制,並確保整個小組的許可權一致,建議您先針對應用程式的本機開發需求建立Microsoft Entra 安全組。

在群組層級指派 Azure 角色,而不是指派給個別使用者,提供數個主要優點:

  • 一致的角色指派

    群組中的所有開發人員都會自動繼承相同的角色和許可權,以確保統一的開發環境。

  • 簡化的角色管理

    當應用程式需要新的角色時,您只需要將它新增至群組一次。 您不需要更新個別使用者權限。

  • 輕鬆上線

    只要將新開發人員新增至群組,即可授與必要的許可權。 不需要手動角色指派。

如果您的組織已經有適合開發團隊使用的Microsoft Entra安全群組,您可以重複使用它。 否則,您可以特別為應用程式建立新的群組。

若要在 Microsoft Entra ID 中建立安全組,請使用 az ad group createe Azure CLI 命令。

此指令需要下列參數:

--display-name:群組的用戶易記名稱

--mail-nickname:用於電子郵件和內部參考的唯一標識符

建議您在應用程式名稱上建立組名基底,並包含後綴,例如 -local-dev 清楚指出其用途。

#!/bin/bash
az ad group create \
    --display-name MyDisplay \
    --mail-nickname MyDisplay  \
    --description "<group-description>"
# PowerShell syntax
az ad group create `
    --display-name MyDisplay `
    --mail-nickname MyDisplay `
    --description "<group-description>"

執行 az ad group create 命令之後,請從命令輸出中複製 id 屬性的值。 您需要 Microsoft Entra 安全組的 Object ID,才能在本文稍後的步驟中指派角色。 若要稍後再次擷取 Object ID ,請使用下列 az ad group show 命令: az ad group show --group "my-app-local-dev" --query id --output tsv

若要將使用者新增至群組,您必須先取得 Object ID 您想要新增的 Azure 用戶帳戶。 使用 az ad user list 命令搭配 --filter 參數,依顯示名稱搜尋特定使用者。 參數 --query 有助於將輸出限制為相關的欄位:

#!/bin/bash
az ad user list \
--filter "startswith(displayName, 'Bob')" \
--query "[].{objectId:id, displayName:displayName}" \
--output table
# PowerShell syntax
az ad user list `
    --filter "startswith(displayName, 'Bob')" `
    --query "[].{objectId:id, displayName:displayName}" `
    --output table

獲得用戶的 Object ID 之後,您可以使用 az ad group member add 命令將他們新增至群組。

#!/bin/bash
az ad group member add \
    --group <group-name> \
    --member-id <object-id>
# PowerShell syntax
az ad group member add `
    --group <group-name> `
    --member-id <object-id>

注意

根據預設,Microsoft Entra 安全組的建立僅限於目錄中的特定特殊許可權角色。 如果無法建立群組,請連絡目錄的系統管理員。 如果無法將成員新增至現有的群組,請連絡群組擁有者或目錄系統管理員。 若要深入了解,請參閱管理 Microsoft Entra 群組和群組成員資格

2 - 將角色指派給 Microsoft Entra 群組

建立Microsoft Entra 安全組並新增成員之後,下一個步驟是判斷應用程式所需的角色(許可權),並將這些角色指派給適當範圍中的群組。

  • 判斷必要角色

    識別應用程式需要運作的角色。 常見的範例包括:

    • Key Vault Secrets 使用者 – 從 Azure Key Vault 讀取秘密
    • 儲存隊列資料貢獻者 – 將訊息傳送至 Azure 隊列儲存體

    如需更多選項,請參閱內建角色定義。

  • 選擇角色指派的範圍

    角色可以在不同的範圍指派:

    • 資源層級 (例如,單一 Key Vault 或記憶體帳戶)
    • 資源群組層級 (建議用於大多數應用程式)
    • 訂用帳戶層級 (謹慎使用 — 最廣泛的存取權)

在此範例中,我們會在資源群組範圍指派角色,這通常是當所有應用程式資源都分組在一個資源群組下時。

使用者、群組或應用程式服務主體會使用 az role assignment create 命令,在 Azure 中指派角色。 您可以使用其 Object ID 來指定群組。

#!/bin/bash
az role assignment create --assignee <objectId> \
    --scope /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName> \
    --role "<roleName>" 
# PowerShell syntax
az role assignment create `
    --assignee <objectId> `
    --scope /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName> `
    --role "<roleName>"

若要取得可指派的角色名稱,請使用 az role definition list 命令。

#!/bin/bash
az role definition list --query "sort_by([].{roleName:roleName, description:description}, &roleName)" --output table
# PowerShell syntax
az role definition list --query "sort_by([].{roleName:roleName, description:description}, &roleName)" --output table

若要將特定資源群組中所有儲存體帳戶的 Azure 記憶體 Blob 容器和數據授與讀取、寫入和刪除存取權,請將記憶體 Blob 數據參與者角色指派給Microsoft Entra 安全組。

#!/bin/bash
az role assignment create --assignee bbbbbbbb-1111-2222-3333-cccccccccccc \
    --scope /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-python-sdk-auth-example \
    --role "Storage Blob Data Contributor"
# PowerShell syntax
az role assignment create --assignee bbbbbbbb-1111-2222-3333-cccccccccccc `
    --scope /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-python-sdk-auth-example `
    --role "Storage Blob Data Contributor"

如需在資源或訂閱等級使用 Azure CLI 指派權限的更多資訊,請參閱使用 Azure CLI 指派 Azure 角色一文。

3 - 使用 Azure CLI、Azure PowerShell、Azure 開發人員 CLI 或在瀏覽器中登入 Azure

若要向 Azure 帳戶進行驗證,請選擇下列其中一種方法:

在開發人員工作站上開啟終端,然後從 Azure CLI 登入 Azure。

az login

4 - 在應用程式中實作 DefaultAzureCredential

若要向 Azure 驗證 Azure SDK 用戶端物件,您的應用程式應該使用 DefaultAzureCredential 套件中的 azure-identity 類別。 這是建議用於本地開發和產品部署的驗證方法。

在本機開發環境中,DefaultAzureCredential 透過依序檢查來確認可用的驗證來源。 具體而言,它會在下列工具中尋找活躍會話:

  • Azure CLI (az login)
  • Azure PowerShell (Connect-AzAccount)
  • Azure 開發人員 CLI(azd auth login)

如果開發人員使用任何這些工具登入 Azure,DefaultAzureCredential 則會自動偵測工作階段,並使用該工作階段的認證向 Azure 服務驗證應用程式。 這可讓開發人員安全地進行驗證,而不需要儲存秘密或修改不同環境的程序代碼。

首先,將 azure.identity 套件新增至您的應用程式。

pip install azure-identity

接下來,針對在應用程式中建立 Azure SDK 用戶端物件的任何 Python 程式代碼,您想要:

  1. 從模組匯入 DefaultAzureCredentialazure.identity 類別。
  2. 建立 DefaultAzureCredential 物件。
  3. DefaultAzureCredential 對象傳遞至 Azure SDK 用戶端物件建構函式。

下列步驟的範例會顯示在下列程式代碼區段中。

from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient

# Acquire a credential object
token_credential = DefaultAzureCredential()

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