將 Azure 裝載的應用程式驗證給其他 Azure 資源的建議方法是使用 受控識別。 大部分的 Azure 服務都支援此方法,包括裝載於 Azure App Service、Azure 容器應用程式和 Azure 虛擬機器上的應用程式。 在 驗證概述 頁面上探索有關不同驗證技術和方法的更多資訊。 在前面的章節中,您將瞭解:
- 基本受控識別概念
- 如何為您的應用程式建立系統指派的受控識別
- 如何將角色指派給系統指派的受控識別
- 如何使用應用程式程式碼中的系統指派受控識別進行驗證
基本受控識別概念
受控識別可讓您的應用程式安全地連線到其他 Azure 資源,而不需要使用秘密金鑰或其他應用程式秘密。 在內部,Azure 會追蹤身分識別,以及允許連線到的資源。 Azure 會使用此資訊來自動取得應用程式的 Microsoft Entra 權杖,以允許它連線到其他 Azure 資源。
設定裝載應用程式時,需要考慮兩種類型的受控識別:
- 系統指派的 受控識別會直接在 Azure 資源上啟用,並系結至其生命週期。 刪除資源時,Azure 會自動為您刪除身分識別。 系統指派的身分識別提供使用受控識別的最小方法。
- 使用者指派 的受控識別會建立為獨立的 Azure 資源,並提供更大的彈性和功能。 它們非常適合涉及需要共用相同身分識別和許可權的多個 Azure 資源的解決方案。 例如,如果多個虛擬機器需要存取同一組 Azure 資源,使用者指派的受控識別可提供可重複使用性和最佳化管理。
小提示
如需如何深入瞭解如何選取和管理系統指派和使用者指派的受控識別,請參閱 受控識別最佳做法建議 一文。
下列各節說明為 Azure 裝載的應用程式啟用和使用系統指派受控識別的步驟。 如果您需要使用使用者指派的受控識別,請流覽 使用者指派的受控識別 一文以取得詳細資訊。
在 Azure 裝載資源上啟用系統指派的受控識別
若要開始搭配應用程式使用系統指派的受控識別,請在裝載應用程式的 Azure 資源上啟用身分識別,例如 Azure App Service、Azure 容器應用程式或 Azure 虛擬機器。
您可以使用 Azure 入口網站或 Azure CLI 來啟用 Azure 資源的系統指派受控識別。
將角色指派給受控識別
接下來,判斷您的應用程式需要哪些角色,並將這些角色指派給受控識別。 您可以在下列範圍將角色指派給受控識別:
- 資源:指派的角色僅適用於該特定資源。
- 資源群組:指派的角色會套用至資源群組中包含的所有資源。
- 訂用帳戶:指派的角色會套用至訂用帳戶中包含的所有資源。
下列範例示範如何在資源群組範圍指派角色,因為許多應用程式都會使用單一資源群組來管理其所有相關 Azure 資源。
流覽至資源群組的 [ 概觀 ] 頁面,其中包含具有系統指派受控識別之應用程式。
選取左側導覽中的存取控制 (IAM)。
在 [ 存取控制 (IAM)] 頁面上,選取頂端功能表上的 [+ 新增 ],然後選擇 [ 新增角色指派 ] 以導覽至 [ 新增角色指派 ] 頁面。
新增 角色指派 頁面會呈現索引標籤式多步驟工作流程,可將角色指派給身分識別。 在初始 角色 索引標籤上,使用頂端的搜尋方塊來尋找您要指派給身分識別的角色。
從結果中選取角色,然後選擇 Next ( 下一步 ) 以移至 Members (成員) 索引標籤。
針對 [指派存取權] 選項,選取 [受控識別]。
針對 [成員] 選項,選擇 [+ 選取成員 ] 以開啟 [選取受控識別 ] 面板。
在 [ 選取受控識別 ] 面板上,使用 [訂用帳戶 ] 和 [受控識別] 下拉式清單來篩選身分識別的搜尋結果。 使用 [ 選取] 搜尋方塊來尋找您針對裝載應用程式的 Azure 資源啟用的系統身分識別。
選取身分識別,然後選擇面板底部的 [選取 ] 以繼續。
選取頁面底部的 檢閱 + 指派 。
在最終的 [ 檢閱 + 指派 ] 索引標籤上,選取 [ 檢閱 + 指派 ] 以完成工作流程。
從您的應用程式向 Azure 服務進行驗證
azidentity 模組提供各種認證 - 適合支援不同案例和 Microsoft Entra 驗證流程的實作TokenCredential。 由於受控識別在本機執行時無法使用,因此接下來的步驟示範在哪個案例中使用哪個認證:
-
本機開發環境: 僅在本機開發期間,請使用 DefaultAzureCredential 作為經過預配置的憑證鏈。
DefaultAzureCredential從本機開發工具中發掘使用者憑證,例如 Azure CLI。 它還為重試、響應等待時間以及對多種身份驗證選項的支持提供了靈活性和便利性。 請瀏覽在本 機開發期間向 Azure 服務進行驗證 一文,以深入瞭解。 - Azure 裝載的應用程式:當您的應用程式在 Azure 中執行時,請使用 ManagedIdentityCredential 安全地探索針對應用程式設定的受控識別。 指定此確切類型的認證可防止意外挑選其他可用認證。
實作程序代碼
新增 azidentity 模組。
在您選擇的終端機中,瀏覽至應用程式項目目錄,然後執行下列命令:
go get github.com/Azure/azure-sdk-for-go/sdk/azidentity
Azure 服務是使用各種 Azure SDK 用戶端程式庫中的特製化用戶端來存取。 針對在應用程式中具現化 Azure SDK 用戶端的任何 Go 程式碼,您必須:
- 匯入
azidentity套件。 - 建立
DefaultAzureCredential類型的實例。 - 將
DefaultAzureCredential類型的實例傳遞至 Azure SDK 用戶端建構函式。
下列程式碼區段顯示其中一個使用 Azure Blob 儲存用戶端的步驟範例。
import (
"context"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)
const (
account = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/"
containerName = "sample-container"
blobName = "sample-blob"
sampleFile = "path/to/sample/file"
)
func main() {
// create a credential
cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
// TODO: handle error
}
// create a client for the specified storage account
client, err := azblob.NewClient(account, cred, nil)
if err != nil {
// TODO: handle error
}
// TODO: perform some action with the azblob Client
// _, err = client.DownloadFile(context.TODO(), <containerName>, <blobName>, <target_file>, <DownloadFileOptions>)
}
如適用於 Go 的 Azure SDK 驗證概觀 一文所述, DefaultAzureCredential 支援多種驗證方法,並決定執行階段使用的驗證方法。 這種方法的好處是,您的應用程式可以在不同的環境中使用不同的驗證方法,而無需實作環境特定的程式碼。 在本機開發過程中,當您的工作站上執行上述程式碼時,DefaultAzureCredential會使用應用程式服務主體(依環境設定而定)或開發人員工具憑證來對其他 Azure 核心資源進行驗證。 因此,相同的程式碼可用來在本機開發期間和部署至 Azure 時向 Azure 資源驗證您的應用程式。
這很重要
DefaultAzureCredential 藉由結合 Azure 裝載環境中使用的認證和本機開發中使用的認證,在開發部署至 Azure 的應用程式時簡化驗證。 在生產環境中,最好使用特定的認證類型,讓驗證更可預測且更容易偵錯。
另一種方法是使用 ManagedIdentityCredential 來替代 DefaultAzureCredential。 使用 ManagedIdentityCredential 步驟與使用 DefaultAzureCredential 類型相同。
下列程式碼區段顯示其中一個使用 Azure Blob 儲存用戶端的步驟範例。
import (
"context"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)
const (
// Replace placeholder text with your storage account name
account = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/"
containerName = "sample-container"
blobName = "sample-blob"
sampleFile = "path/to/sample/file"
)
func main() {
// create a credential
cred, err := azidentity.NewManagedIdentityCredential(nil)
// When using User Assigned Managed Identity use this instead and pass your client id in the options
// clientID := azidentity.ClientID("abcd1234-...")
// opts := azidentity.ManagedIdentityCredentialOptions{ID: clientID}
// cred, err := azidentity.NewManagedIdentityCredential(&opts)
if err != nil {
// TODO: handle error
}
// create a client for the specified storage account
client, err := azblob.NewClient(account, cred, nil)
if err != nil {
// TODO: handle error
}
// TODO: perform some action with the azblob Client
// _, err = client.DownloadFile(context.TODO(), <containerName>, <blobName>, <target_file>, <DownloadFileOptions>)
}
上述程式碼的行為會因執行環境而異:
- 在本機開發工作站上,
DefaultAzureCredential在環境變數中尋找應用程式服務主體,或在本機安裝的開發人員工具 (例如 Azure CLI) 中尋找一組開發人員認證。 - 部署至 Azure 時,
ManagedIdentityCredential會探索您的受控識別設定,以自動向其他服務進行驗證。