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

在本機開發期間,應用程式必須向 Azure 進行驗證,才能使用不同的 Azure 服務。 可透過以下方法之一進行本地驗證:

本文說明如何使用開發者帳號,搭配 Azure Identity 函式庫支援的工具進行認證。 在以下章節中,你會學到:

  • 如何使用 Microsoft Entra 群組有效率地管理多個開發人員帳戶的許可權。
  • 如何將角色指派給開發人員帳戶以限定權限範圍。
  • 如何登入支援的在地開發工具。
  • 如何透過應用程式代碼中的開發者帳號來認證。

驗證的開發人員支援工具

若要讓應用程式在本地開發期間使用開發者的 Azure 憑證認證 Azure,開發者必須從以下開發工具之一登入 Azure:

  • Azure CLI
  • Azure Developer CLI
  • Azure PowerShell

Azure 身份函式庫可以偵測開發者是否已從這些工具登入。 然後,程式庫可以透過工具取得 Microsoft Entra 存取權杖,以登入使用者身分向 Azure 驗證應用程式。

此方法會利用開發人員現有的 Azure 帳戶來簡化驗證程式。 不過,開發人員帳戶的許可權可能多於應用程式所需的許可權,因此會超出應用程式在生產環境中執行的許可權。 或者,您也可以 建立應用程式服務主體,以在本機開發期間使用,其範圍可限定為只有應用程式所需的存取權。

建立 Microsoft Entra 群組以進行本機開發

建立 Microsoft Entra 群組,以封裝應用程式在本機開發中所需的角色 (權限),而不是將角色指派給個別服務主體物件。 此方法提供下列優點:

  • 每個開發人員在群組層級都指派相同的角色。
  • 如果應用程式需要新角色,則只需要將其新增至應用程式的群組即可。
  • 如果新的開發人員加入小組,則會為開發人員建立新的應用程式服務主體,並新增至群組,以確保開發人員具有在應用程式上工作的正確權限。
  1. 流覽至 Azure 入口網站中的 Microsoft Entra ID 概觀頁面。

  2. 從左側功能表中選取 [所有群組]。

  3. 在 [群組] 頁面上,選取 [新增群組]。

  4. 在 [新增群組 ] 頁面上,填寫下列表單欄位:

    • 群組類型:選取 [安全性]。
    • 群組名稱:輸入包含應用程式或環境名稱參考的群組名稱。
    • 群組描述:輸入說明群組用途的描述。

    螢幕擷取畫面,示範如何在 Azure 入口網站中建立群組。

  5. 選擇 [未選取成員] 連結於 [成員 ] 下以將成員新增至群組。

  6. 在開啟的飛出視窗面板中,搜尋您稍早建立的服務主體,然後從篩選的結果中選取它。 選擇面板底部的「 選取」 按鈕以確認您的選擇。

  7. 選取 [新增群組] 頁面底部的 [建立] 以建立群組,然後返回 [所有群組] 頁面。 如果您沒有看到列出的新群組,請稍候一下並重新整理頁面。

將角色指派給群組

接下來,判斷您的應用程式在哪些資源上需要哪些角色 (許可權),並將這些角色指派給您建立的 Microsoft Entra 群組。 群組可以在資源、資源群組或訂閱範圍內被指派角色。 此範例示範如何在資源群組範圍指派角色,因為大部分的應用程式都會將其所有 Azure 資源分組到單一資源群組中。

  1. 在 Azure 入口網站中,流覽至包含應用程式之資源群組的 [ 概觀 ] 頁面。

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

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

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

  5. 在 「成員」 標籤上:

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

    螢幕擷取畫面,示範如何將角色指派給 Microsoft Entra 群組。

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

藉由開發工具登入 Azure

接著,使用多種開發者工具登入 Azure,這些工具可以在你的開發環境中進行驗證。 您驗證的帳戶也應該存在於您稍早建立和設定的 Microsoft Entra 群組中。

開發人員可以使用 Azure CLI 進行驗證。 使用 DefaultAzureCredential 或 AzureCLICredential 的應用程式可以使用此帳號來驗證應用程式請求。

若要使用 Azure CLI 進行驗證,請執行 az login 命令。 在具有預設網頁瀏覽器的系統上,Azure CLI 會啟動瀏覽器來驗證使用者。

az login

對於沒有預設網頁瀏覽器的系統,az login 命令會使用裝置程式代碼驗證流程。 您也可以強制 Azure CLI 採用裝置程式碼流程,而不是指定 --use-device-code 引數來啟動瀏覽器。

az login --use-device-code

從您的應用程式向 Azure 服務進行驗證

azidentity 套件提供各種認證,以支援不同的案例和 Microsoft Entra 驗證流程。 以下步驟說明如何在本地開發和生產環境中使用 DefaultAzureCredential 來管理服務主體。

實作程序代碼

若要向 Azure 驗證 Azure SDK 用戶端物件,您的應用程式應該使用 DefaultAzureCredential 類別。 在此情境中, DefaultAzureCredential 依序檢查開發者是否使用 Azure CLI 或 Azure 開發者 CLI 登入 Azure。 如果開發者使用這些工具登入 Azure,應用程式會利用這些憑證進行認證。

DefaultAzureCredential 是一連串有序的機制,用於驗證 Microsoft Entra ID。 每個認證機制都是實作介面 TokenCredential 的一種類型,稱為 憑證。 DefaultAzureCredential 順序檢查開發者是否使用 Azure CLI 或 Azure 開發者 CLI 登入 Azure。 如果開發者使用這些工具登入 Azure,應用程式會利用這些憑證進行認證。 欲了解更多關於自訂憑證鏈的資訊,請參閱 「如何自訂 DefaultAzureCredential」。

  1. 將該 azidentity 套件加入您的申請表。

    go get github.com/Azure/azure-sdk-for-go/sdk/azidentity
    
  2. 對於任何在應用程式中建立 Azure SDK 客戶端物件的 Go 程式碼,你應該:

    1. 匯入 azidentity 套件。
    2. 使用 DefaultAzureCredential 或 AzureCLICredential 建立憑證實例。 例如:
    • 使用 DefaultAzureCredential時,將環境變數 AZURE_TOKEN_CREDENTIALS 設為 dev ,表示該應用程式正在開發環境中執行。 如需詳細資訊,請參閱 如何自訂 DefaultAzureCredential。

      // Environment variable AZURE_TOKEN_CREDENTIALS=dev or a specific developer tool credential value
      cred, err := azidentity.NewDefaultAzureCredential(nil)
      
    • 或者使用特定的憑證,例如 AzureCLICredential、 AzureDeveloperCLICredential 或 AzurePowerShellCredential,以使用登入的使用者來驗證特定開發工具。

      cred, err := azidentity.NewAzureCLICredential(nil)
      // or cred, err := azidentity.NewAzureDeveloperCLICredential(nil)
      // or cred, err := azidentity.NewAzurePowerShellCredential(nil)
      
    1. 將認證實例傳給 Azure SDK 客戶端構造函數。

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

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)
	// or cred, err := azidentity.NewAzureCLICredential(nil)
	// or cred, err := azidentity.NewAzureDeveloperCLICredential(nil)
	// or cred, err := azidentity.NewAzurePowerShellCredential(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>)
}