共用方式為


在本地開發期間,利用服務主體將 Go 應用程式認證為 Azure 服務

在本機開發期間,應用程式需要向 Azure 進行驗證,才能存取各種 Azure 服務。 本機驗證的兩個常見方法是 使用開發人員帳戶 或服務主體。 本文說明如何使用應用程式服務主體。 在以下章節中,你會學到:

  • 如何使用 Microsoft Entra 註冊應用程式,以建立服務主體
  • 如何使用Microsoft Entra 群組有效率地管理許可權
  • 如何將角色指派給權限範圍
  • 如何從應用程式程式代碼使用服務主體進行驗證

透過使用專用的應用程式服務主體,你可以在存取 Azure 資源時遵守最小權限原則。 在開發過程中,將權限限制在應用程式的特定需求範圍內,避免誤入 Azure 資源,該資源原本是用於其他應用程式或服務的。 這種方法也有助於避免當應用程式移至生產環境時發生問題,確保應用程式在開發環境中不會被過度授予權限。

顯示本機 Go 應用程式如何使用服務主體連線到 Azure 資源的圖表。

當你在 Azure 註冊應用程式時,你會建立一個應用程式服務主體。 針對本機開發:

  • 為每個開發者建立獨立的應用程式註冊,讓每個開發者擁有自己的應用程式服務主體,且不需要共享憑證。
  • 為每個應用程式建立個別的應用程式註冊,以限制應用程式的權限僅限於必要的範圍。

在本地開發時,設定環境變數與應用程式服務主體的身份。 Azure 身分識別連結庫會讀取這些環境變數,以向所需的 Azure 資源驗證應用程式。

在 Azure 中註冊應用程式

應用程式服務主體物件可以透過使用 Azure 入口網站或 Azure CLI,在 Azure 中註冊應用程式時所建立。

  1. 在 Azure 入口網站中,使用搜尋列流覽至 [應用程式註冊] 頁面。

  2. 在 [應用程式註冊] 頁面上,選取 [+ 新增註冊]。

  3. 註冊應用程式 頁面上:

    • 針對 [名稱] 字段,輸入包含應用程式名稱和目標環境的描述性值。
    • 針對 支援的帳戶類型,請選取 僅限此組織目錄內的帳戶(僅限 Microsoft 客戶導向 - 單一租戶)或是最符合您需求的選項。
  4. 選取 [] 註冊 [] 以註冊您的應用程式並建立服務主體。

    顯示如何在 Azure 入口網站中建立應用程式註冊的螢幕快照。

  5. 在應用程式的 [應用程式註冊] 頁面上,複製 應用程式識別碼目錄(租使用者)標識碼 並貼到暫存位置,以供稍後在應用程式程式代碼組態中使用。

  6. 選取 [[新增憑證或秘密],以設定應用程式的認證。

  7. 在 [憑證 & 秘密] 頁面上,選取 [+ 新增客戶端密碼]

  8. 在開啟的 [新增客戶端密碼 浮出視窗] 中:

    • 針對 [描述],輸入 Current 的值。
    • 針對 Expires 值,保留建議的預設值 180 天。
    • 選取 ,然後添加 以增加秘密。
  9. 在 [憑證 & 秘密] 頁面上,複製用戶端密碼的 Value 屬性,以供日後步驟使用。

    備註

    客戶端密碼值只會在建立應用程式註冊之後顯示一次。 您可以新增更多客戶端密碼,而不會使此客戶端密碼失效,但無法再次顯示此值。

建立 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 Identity 函式庫中的某些憑證,如 DefaultAzureCredentialEnvironmentCredentialClientSecretCredential,會依照慣例在環境變數中搜尋服務主體資訊。 你可以根據你的工具和環境,以多種方式配置環境變數。 你可以在開發過程中建立 .env 檔案或使用系統環境變數將這些憑證儲存在本地。 由於大多數開發者同時處理多個應用程式,開發期間可以使用類似 godotenv 套件的套件,從應用程式目錄中儲存的檔案存取環境變數 .env 。 此方法將用於驗證應用程式的環境變數範圍設定為 Azure,只有該應用程式能使用。 千萬不要將 .env 檔案提交到原始碼控制系統,因為它包含了 Azure 的應用程式機密金鑰。 Go 的標準 .gitignore 檔案會自動從簽入中排除檔案 .env

要使用該 godotenv 套件,先在你的應用程式中安裝該套件。

go get github.com/joho/godotenv

然後,在應用程式根目錄中建立檔案 .env 。 將環境變數值設定為從應用程式註冊過程中取得的服務主體值:

  • AZURE_CLIENT_ID:用來識別 Azure 中已註冊的應用程式。
  • AZURE_TENANT_ID:Microsoft Entra 租用戶的識別碼。
  • AZURE_CLIENT_SECRET:為應用程式產生的秘密認證。
AZURE_CLIENT_ID=<your-client-id>
AZURE_TENANT_ID=<your-tenant-id>
AZURE_CLIENT_SECRET=<your-client-secret>

最後,在應用程式的啟動程式碼中,使用 godotenv 程式庫在啟動時從檔案中 .env 讀取環境變數。

// Imports of fmt, log, and os omitted for brevity 
import "github.com/joho/godotenv"

environment := os.Getenv("ENVIRONMENT")

if environment == "development" {
	fmt.Println("Loading environment variables from .env file")

	// Load the .env file
	err := godotenv.Load(".env")
	if err != nil {
	    log.Fatalf("Error loading .env file: %v", err)
	}
}

如果你偏好在系統環境中設定環境變數,而非使用 .env 檔案,根據你的作業系統和殼層,可以用多種方式來實現。 以下範例展示了如何在不同 shell 中設定環境變數:

export AZURE_CLIENT_ID=<your-client-id>
export AZURE_TENANT_ID=<your-tenant-id>
export AZURE_CLIENT_SECRET=<your-client-secret>

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

Azure Identity 函式庫提供多種 TokenCredential 情境及 Microsoft Entra 認證流程的不同實作。 請在本地和生產環境中與服務主體合作時使用 EnvironmentCredential。 在此情境中,讀取 EnvironmentCredential 環境變數 AZURE_CLIENT_IDAZURE_TENANT_ID,並 AZURE_CLIENT_SECRET 取得應用程式服務主體資訊以連接 Azure。

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

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

    1. 匯入 azidentity 套件。
    2. 建立一個 EnvironmentCredential 實例。
    3. 將實例傳給 Azure SDK 客戶端建構器。

    以下程式碼段展示了一個範例:

    import (
    	"context"
    	"os"
    
    	"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.NewEnvironmentCredential(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>)
    }