向其他 Azure 資源驗證 Azure 裝載應用程式的建議方法是使用 受控識別。 此方法 支援大部分的 Azure 服務,包括裝載在 Azure App Service、Azure Container Apps 和 Azure 虛擬機上的應用程式。 在驗證概覽頁面上瞭解更多不同的驗證技術和方法。 在接下來的各節中,您將瞭解:
- 基本受控識別概念
- 如何為您的應用程式建立使用者指派的受控識別
- 如何將角色指派給使用者指定的受管理識別
- 如何從應用程式程式代碼使用使用者指派的受控識別進行驗證
基本受控識別概念
受控識別可讓您的應用程式安全地連線到其他 Azure 資源,而不需要使用秘密金鑰或其他應用程式秘密。 在內部,Azure 會追蹤身分識別,以及允許其連線的資源。 Azure 會使用這項資訊自動取得應用程式Microsoft Entra 令牌,以允許它連線到其他 Azure 資源。
設定載入的應用程式時,需要考慮兩種類型的受控識別:
-
系統指派 受控身分識別是在 Azure 資源上直接啟用的,並與其生命周期緊密相連。 刪除資源時,Azure 會自動為您刪除身分識別。 系統指派的身分識別提供使用受控識別的極簡方法。
-
使用者指派的 管理的身分會建立為獨立的 Azure 資源,並提供更強的彈性與功能。 其適用於涉及多個需要共用相同身分識別和許可權之 Azure 資源的解決方案。 例如,如果多個虛擬機需要存取同一組 Azure 資源,則使用者指派的受控識別可提供重複使用性和優化管理。
小提示
如需如何深入瞭解如何選取和管理系統指派和使用者指派的受控識別,請參閱 受控識別最佳做法建議 一文。
前面的各節說明為 Azure 裝載的應用程式啟用和使用使用者指派的受控識別的步驟。 如果您需要使用系統指派的受控識別,請造訪 系統指派的受控識別 一文以取得詳細資訊。
建立使用者指派的管理型身分識別
使用者指派的受控識別會使用 Azure 入口網站或 Azure CLI,在您的 Azure 訂用帳戶中建立為獨立資源。 Azure CLI 命令可以在 Azure Cloud Shell 或已安裝 Azure CLI 的工作站上執行。
在 Azure 入口網站中,在主要搜尋列中輸入 受控識別,然後選取 [Services] 區段底下的相符結果。
在 [受控識別] 頁面上,選取 [+ 建立]。
在 [建立使用者指派的受控識別 頁面上,選取使用者指派受控識別的訂用帳戶、資源群組和區域,然後提供名稱。
選取 [檢閱 + 建立],以檢閱和驗證您的輸入。
選取 [建立],以建立使用者指派的受控識別。
建立身份之後,選擇 移至資源。
在新身分識別的 [概觀] 頁面上,複製 用戶端標識碼 值,以供稍後設定應用程式程式代碼時使用。
使用 Azure CLI 命令 az identity create 來建立受控識別:
az identity create \
--resource-group <resource-group-name> \
--name <identity-name> \
--query 'clientId' \
--output json
命令輸出會列印所建立使用者指派受控識別的用戶端標識碼。 用戶端識別碼可用來設定依賴身分識別的應用程式程式碼。
您可以使用 az identity show 命令再次檢視受控識別屬性:
az identity show \
--resource-group <your-resource-group> \
--name <your-managed-identity-name> \
--output json
將受控識別指派給您的應用程式
使用者指派的受控識別可以與一或多個 Azure 資源相關聯。 使用該身分識別的所有資源都會獲得透過身分識別角色授予的權限。
在 Azure 入口網站中,瀏覽至裝載應用程式程式代碼的資源,例如 Azure App Service 或 Azure Container App 實例。
從資源的 [概觀] 頁面中,展開 [[設定],然後從導覽中選取 [身分識別]。
在 [身分識別] 頁面上,切換至 [使用者指派] 索引標籤。
選取 + 新增 以開啟 新增使用者指派的受控識別 面板。
在 [新增使用者指定的受控身份 面板上,使用 [訂用帳戶] 下拉式清單來篩選您的身份搜尋結果。 使用 [使用者指派的受控識別 搜尋方塊,找出您為裝載應用程式的 Azure 資源啟用的使用者指派受控識別。
選取身分識別,然後在面板底部選擇 [新增] 以繼續。
Azure CLI 提供不同的命令,將使用者指派的受控識別指派給不同類型的裝載服務。
若要使用 Azure CLI 將使用者指派的受控識別指派給 Azure App Service Web 應用程式等資源,您需要身分識別的資源識別碼。 使用 az identity show 命令來擷取資源識別碼:
az identity show \
--resource-group <your-resource-group> \
--name <your-managed-identity-name> \
--output json \
--query id
擁有資源標識符之後,請使用 Azure CLI 命令 az <resourceType> identity assign 命令,將使用者指派的受控識別與不同的資源產生關聯,例如:
針對 Azure App Service,請使用 Azure CLI 命令 az webapp identity assign:
az webapp identity assign \
--resource-group <resource-group-name> \
--name <webapp-name> \
--identities <user-assigned-identity-resource-id>
針對 Azure Container Apps,請使用 Azure CLI 命令 az containerapp identity assign:
az containerapp identity assign \
--resource-group <resource-group-name> \
--name <containerapp-name> \
--identities <user-assigned-identity-resource-id>
針對 Azure 虛擬機器,請使用 Azure CLI 命令 az vm identity assign:
az vm identity assign \
--resource-group <resource-group-name> \
--name <vm-name> \
--identities <user-assigned-identity-resource-id>
將角色指派給管理的身分識別
接下來,判斷您的應用程式需要哪些角色,並將這些角色指派給受控識別。 您可以在下列範圍將角色指派給受控識別:
-
資源:指派的角色僅適用於該特定資源。
-
資源群組:指派的角色會套用至資源群組中包含的所有資源。
-
訂用帳戶:指派的角色會套用至訂用帳戶中包含的所有資源。
下列範例示範如何在資源群組範圍指派角色,因為許多應用程式都會使用單一資源群組來管理其所有相關的 Azure 資源。
流覽至資源群組的 [概觀] 頁面,其中包含具有使用者指派受控識別的應用程式。
請選取左側導覽列中的 存取控制 (IAM)。
在 [存取控制 (IAM)] 頁面上,選取頂端功能表上的 [+ 新增],然後選擇 [新增角色指派] 導覽至 [新增角色指派] 頁面。
[新增角色指派] 頁面會顯示多步驟的索引標籤式工作流程,以將角色指派給身分。 在 [初始 角色] 索引標籤上,使用頂端的搜尋方塊來找出您要指派給身分識別的角色。
從結果中選取角色,然後選擇 [下一步] 以移至 [成員] 標籤。
針對 [[指派存取權給] 選項,選取 [受控識別]。
針對 [成員] 選項,選取 [+ 選取成員] 以開啟 [選取受控識別] 面板。
在 [選取受控識別 面板上,使用 [訂用帳戶] 和 [受控 識別] 下拉式清單來篩選您身分識別的搜尋結果。 使用 選擇 搜尋方塊,以搜尋您為託管應用程式的 Azure 資源啟用的使用者分配的受控身分識別。
選取身分,然後在面板底部選擇[選取]以繼續。
請在頁面底部點選 ,然後選擇 [檢閱 + 指派]。
在最後一個 [檢閱 + 指派] 索引標籤上,選取 [檢閱 + 指派],以完成工作流程。
若要使用 Azure CLI 將角色指派給使用者指派的受控識別,您需要身分識別的主體標識碼。 使用 az identity show 命令來擷取主體識別碼:
az identity show \
--resource-group <your-resource-group> \
--name <your-managed-identity-name> \
--output json \
--query principalId
使用 az role definition list 命令來查看受控識別可以被指派哪些角色:
az role definition list \
--query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
--output table
使用 az role assignment create 命令,將角色指派給受控身份:
az role assignment create \
--assignee <your-principal-id> \
--role <role-name> \
--scope <scope>
例如,若要允許具有讀取、寫入和刪除識別碼的 99999999-9999-9999-9999-999999999999 受控識別存取 Azure 儲存體 Blob 容器和資料,以存取 msdocs-sdk-auth-example 資源群組中的所有儲存體帳戶,請使用下列命令將應用程式服務主體指派給 儲存體 Blob 資料參與者 角色:
az role assignment create \
--assignee 99999999-9999-9999-9999-999999999999 \
--role "Storage Blob Data Contributor" \
--scope "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/msdocs-sdk-auth-example"
如需使用 Azure CLI 在資源或訂用帳戶層級指派許可權的相關信息,請參閱 使用 Azure CLI指派 Azure 角色一文。
從您的應用程式向 Azure 服務進行驗證
Azure 身分識別程式庫 提供各種 認證的實作,以支援不同的情境和 Microsoft Entra 驗證流程。 由於在本機執行時無法使用受控身分識別,後續步驟會示範應該在什麼情況下使用哪種認證:
實作程序代碼
透過前往應用程式專案目錄並執行以下指令,將 azure-identity 套件加入您的應用程式:
pip install azure-identity
Azure 服務是使用來自各種 Azure SDK 用戶端連結庫的特殊客戶端類別來存取。 以下程式碼範例示範如何建立憑證實例並與 Azure SDK 服務客戶端一起使用。 在您的應用程式代碼中,請完成以下步驟以使用管理身份進行認證:
- 從模組匯入
ManagedIdentityCredentialazure.identity 類別。
- 建立一個
ManagedIdentityCredential 物件,並設定用戶端 ID、資源 ID 或物件 ID。
- 將物件傳給
ManagedIdentityCredential Azure SDK 客戶端建構器。
在設定需要使用該身分識別進行驗證的應用程式或服務時,用戶端標識碼可用來識別受控識別。
使用下列命令擷取指派給使用者指派受控識別的用戶端識別碼:
az identity show \
--resource-group <resource-group-name> \
--name <identity-name> \
--query 'clientId'
使用客戶識別碼配置 ManagedIdentityCredential:
from azure.identity import ManagedIdentityCredential
from azure.storage.blob import BlobServiceClient
credential = ManagedIdentityCredential(
client_id="<client-id>"
)
blob_service_client = BlobServiceClient(
account_url="https://<account-name>.blob.core.windows.net",
credential=credential
)
資源標識符會使用下列結構,唯一識別 Azure 訂用帳戶內的受控識別資源:
/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}
資源標識碼可以透過慣例來建置,這可讓您在環境中使用大量使用者指派的受控識別時更方便。
使用下列命令擷取使用者指派受控識別的資源識別碼:
az identity show \
--resource-group <resource-group-name> \
--name <identity-name> \
--query 'id'
使用資源識別碼設定 ManagedIdentityCredential:
from azure.identity import ManagedIdentityCredential
from azure.storage.blob import BlobServiceClient
credential = ManagedIdentityCredential(
identity_config={"resource_id": "<resource-id>"}
)
blob_service_client = BlobServiceClient(
account_url="https://<account-name>.blob.core.windows.net",
credential=credential
)
主體標識碼是物件標識碼的另一個名稱。
使用下列命令擷取使用者指派受控識別的物件識別碼:
az identity show \
--resource-group <resource-group-name> \
--name <identity-name> \
--query 'principalId'
使用物件識別碼設定 ManagedIdentityCredential:
from azure.identity import ManagedIdentityCredential
from azure.storage.blob import BlobServiceClient
credential = ManagedIdentityCredential(
identity_config={"object_id": "<object-id>"}
)
blob_service_client = BlobServiceClient(
account_url="https://<account-name>.blob.core.windows.net",
credential=credential
)