使用適用於 Go 的 Azure 身分識別模組進行 Azure 驗證

在本教學課程中, 適用於 Go 的 Azure 身分識別模組中的 DefaultAzureCredential 類型可用來向 Azure 進行驗證。 Azure 身分識別模組提供數種認證類型,著重於具有 Microsoft Entra ID 的 OAuth。

DefaultAzureCredential 藉由結合常用的認證類型來簡化驗證。 它會鏈結用來驗證 Azure 部署應用程式的認證類型,以及用來在開發環境中進行驗證的認證類型。

必要條件

  • Azure 訂用帳戶:如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶

1.安裝適用於 Go 的 Azure 身分識別模組

執行下列命令以下載 azidentity 模組:

go get -u github.com/Azure/azure-sdk-for-go/sdk/azidentity

2.使用 Azure 進行驗證

DefaultAzureCredential使用 以下列其中一種技術向 Azure 進行驗證:

若要深入瞭解不同的認證類型,請參閱 認證類型

選項 1:定義環境變數

DefaultAzureCredential 使用 EnvironmentCredential 支援三種驗證類型的環境變數來設定驗證。 從下列驗證類型中選擇,並定義適當的環境變數。

具有秘密的服務主體

變數名稱
AZURE_CLIENT_ID Azure 服務主體的應用程式標識碼
AZURE_TENANT_ID 應用程式的 Microsoft Entra 租使用者識別碼
AZURE_CLIENT_SECRET Azure 服務主體的密碼
export AZURE_TENANT_ID="<active_directory_tenant_id"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_SECRET="<service_principal_password>"

具有憑證的服務主體

變數名稱
AZURE_CLIENT_ID Microsoft Entra 應用程式的標識碼
AZURE_TENANT_ID 應用程式的 Microsoft Entra 租使用者識別碼
AZURE_CLIENT_CERTIFICATE_PATH 憑證檔案的路徑,包括私鑰(不含密碼保護)
export AZURE_TENANT_ID="<active_directory_tenant_id>"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_CERTIFICATE_PATH="<azure_client_certificate_path>"

使用者名稱與密碼

變數名稱
AZURE_CLIENT_ID Microsoft Entra 應用程式的標識碼
AZURE_USERNAME 使用者名稱(通常是電子郵件位址)
AZURE_PASSWORD 該用戶的密碼
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_USERNAME="<azure_username>"
export AZURE_PASSWORD="<azure_user_password>"

在上述順序中嘗試設定。 例如,如果客戶端密碼和憑證的值都存在,則會使用客戶端密碼。

選項 2:使用工作負載身分識別

Microsoft Entra 工作負載 ID 可讓 Kubernetes 叢集中的 Pod 使用 Kubernetes 身分識別(服務帳戶)。 發出 Kubernetes 令牌,而 OIDC 同盟 可讓 Kubernetes 應用程式使用 Microsoft Entra ID 安全地存取 Azure 資源。

如果 的必要環境變數 EnvironmentCredential 不存在, DefaultAzureCredential 請嘗試使用 WorkloadIdentityCredential 進行驗證。 WorkloadIdentityCredential 嘗試從工作負載識別 Webhook 所設定的環境變數讀取服務主體組態。

選項3:使用受控識別

受控識別可免除開發人員管理認證的需求。 藉由連線到支援 Microsoft Entra 驗證的資源,應用程式可以使用 Microsoft Entra 令牌,而不是認證。

如果 的必要環境變數 WorkloadIdentityCredential 不存在, DefaultAzureCredential 請嘗試使用 ManagedIdentityCredential 進行驗證。

如果使用使用者指派的受控識別,請執行下列命令來設定 AZURE_CLIENT_ID 環境變數。

export AZURE_CLIENT_ID="<user_assigned_managed_identity_client_id>"

選項 4:使用 Azure CLI 登入

若要減少本機開發的摩擦, DefaultAzureCredential 可以在使用者登入 Azure CLI 時進行驗證。

執行下列命令以登入 Azure CLI:

az login

不建議在 Azure 中執行的應用程式使用 Azure CLI 驗證。

3.使用 DefaultAzureCredential 來驗證 ResourceClient

使用 建立名為 azure-auth 的新範例 Go 模組,以測試向 Azure DefaultAzureCredential進行驗證:

  1. 建立目錄以測試並執行範例 Go 程式代碼,然後變更至該目錄。

  2. 執行 go mod init 以建立模組:

    go mod init azure-auth
    
  3. 執行 go 以 下載、建置及安裝必要的 Azure SDK for Go 模組:

    go get "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    go get "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription"
    
  4. 建立名為 main.go 的檔案,並插入下列程式碼:

    package main
    
    import (
      "context"
    
      "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
      "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription"
    )
    
    const subscriptionID = "<subscription ID>"
    
    func main() {
      cred, err := azidentity.NewDefaultAzureCredential(nil)
      if err != nil {
        // TODO: handle error
      }
      // Azure SDK Resource Management clients accept the credential as a parameter.
      // The client will authenticate with the credential as necessary.
      client, err := armsubscription.NewSubscriptionsClient(cred, nil)
      if err != nil {
        // TODO: handle error
      }
      _, err = client.Get(context.TODO(), subscriptionID, nil)
      if err != nil {
        // TODO: handle error
      }
    }   
    
    

    將取代 <subscription ID> 為您的訂用帳戶標識碼。

  5. 執行 go run 以建置並執行應用程式:

    go run .
    

使用 DefaultAzureCredential 向 Azure 進行驗證

在應用程式中使用下列程式代碼,使用 向 Azure 身分識別模組 DefaultAzureCredential進行驗證:

// This credential type checks environment variables for configuration.
cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
  // handle error
}

// Azure Resource Management clients accept the credential as a parameter
client, err := armresources.NewClient("<subscriptionId>", cred, nil)
if err != nil {
  // handle error
}

疑難排解

如需解決特定認證類型錯誤的指導,請參閱 疑難解答指南

下一步