共用方式為


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

開發人員建立雲端應用程式時,通常會在本機工作站上偵錯及測試應用程式。 當應用程式在本機開發期間於開發人員的工作站上執行時,它仍必須向應用程式使用的任何 Azure 服務進行驗證。 本文說明如何在本機開發期間,使用開發人員的 Azure 認證向 Azure 驗證應用程式。

顯示 Go 應用程式在本機開發期間如何使用開發人員的認證從本機安裝的開發工具取得這些認證來連線到 Azure 的圖表。

若要讓應用程式在本機開發期間使用開發人員的 Azure 認證向 Azure 認證,開發人員必須從 Azure CLI 或 Azure 開發 CLI 登入 Azure。 Azure SDK for Go 能夠偵測開發人員已從其中一個工具登入,然後從認證快取取得必要的認證,以以登入使用者身分向 Azure 驗證應用程式。

這種方法最容易為開發小組設定,因為它會利用開發人員現有的 Azure 帳戶。 不過,開發人員的帳戶可能會擁有比應用程式所需更多的許可權,從而超出應用程式在生產環境中執行時的許可權。 或者,您也可以 建立應用程式服務主體,以在本機開發期間使用,其範圍可限定為只有應用程式所需的存取權。

1 - 建立 Microsoft Entra 安全性群組以進行本機開發

由於通常有多位開發人員在應用程式上工作,因此建議您先建立 Microsoft Entra 安全性群組,以包含應用程式在本機開發中所需的角色(權限)。 此方法提供下列優點。

  • 因為角色是在群組層級指派,所以能確保每個開發人員都被指派相同的角色。
  • 如果應用程式需要新的角色,則只需要將它新增至應用程式的 Microsoft Entra 群組。
  • 如果新的開發人員加入小組,他們只需要新增至正確的Microsoft Entra 群組,才能取得正確的許可權來處理應用程式。

如果您有開發小組的現有Microsoft Entra 安全組,您可以使用該群組。 否則,請完成下列步驟來建立Microsoft Entra 安全組。

az ad group create 命令用來在 Microsoft Entra ID 中建立群組。 需要 --display-name--main-nickname 參數。 提供給群組的名稱應該以應用程式的名稱為基礎。 在群組名稱中包含類似 『local-dev』 的片語也很有用,以指出群組的用途。

az ad group create \
    --display-name MyDisplay \
    --mail-nickname MyDisplay  \
    --description "<group-description>"

在命令的輸出中複製 id 屬性的值。 這是群組的物件識別碼。 您在後續步驟中需要用到它。 您也可以使用 az ad group show 命令來擷取此屬性。

若要將成員新增至群組,您需要 Azure 使用者的物件識別碼。 使用 az ad user list 列出可用的服務主體。 --filter 參數命令接受 OData 樣式篩選,並可用來篩選使用者顯示名稱上的清單,如下所示。 --query 參數會將輸出限制為感興趣的數據行。

az ad user list \
    --filter "startswith(displayName, 'Bob')" \
    --query "[].{objectId:id, displayName:displayName}" \
    --output table

可以使用 az ad group member add 命令來將成員新增至群組。

az ad group member add \
    --group <group-name> \
    --member-id <object-id>

注意

根據預設,Microsoft Entra 安全組的建立僅限於目錄中的特定特殊許可權角色。 如果您無法建立群組,請連絡目錄的系統管理員。 如果您無法將成員新增至現有的群組,請連絡群組擁有者或目錄管理員。 若要深入瞭解,請參閱 管理 Microsoft Entra 群組和群組成員資格

2 - 將角色指派給 Microsoft Entra 群組

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

使用者、群組或應用程式服務主體會使用 az role assignment create 命令 在 Azure 中指派角色。 您可以使用其物件識別碼來指定群組。

az role assignment create --assignee <objectId> \
    --scope /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName> \
    --role "<roleName>" 

若要取得可指派的角色名稱,請使用 az role definition list 命令

az role definition list --query "sort_by([].{roleName:roleName, description:description}, &roleName)" --output table

例如,若要允許具有 bbbbbbbb-1111-2222-3333-cccccccccccc 讀取、寫入和刪除物件標識符的群組成員,存取 msdocs-go-sdk-auth-aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e example 訂用帳戶中所有儲存體帳戶中的 Azure 記憶體 Blob 容器和數據,並使用下列命令將 記憶體 Blob 數據參與者 角色指派給群組。

az role assignment create --assignee bbbbbbbb-1111-2222-3333-cccccccccccc \
    --scope /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-go-sdk-auth-example \
    --role "Storage Blob Data Contributor"

如需使用 Azure CLI 在資源或訂用帳戶層級指派許可權的相關信息,請參閱 使用 Azure CLI指派 Azure 角色一文。

3 - 使用 Azure CLI 或 Azure 開發人員 CLI 登入 Azure

在開發人員工作站上開啟終端機,然後從 Azure CLI登入 Azure。

az login

4 - 在您的應用程式中實作 DefaultAzureCredential

若要向 Azure 驗證 Azure SDK 用戶端物件,您的應用程式應該使用 DefaultAzureCredential 類別。 在此案例中,DefaultAzureCredential 會循序檢查開發人員是否已使用 Azure CLI 或 Azure 開發人員 CLI 登入 Azure。 如果開發人員使用其中一個工具來登入 Azure,則應用程式會使用用來登入工具的認證向 Azure 進行驗證。

首先,將 azidentity 套件新增至您的應用程式。

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

接下來,對於應用程式中任何用於建立 Azure SDK 客戶端物件的 Go 程式碼,您可能想要:

  1. 匯入 azidentity 套件。
  2. 建立 DefaultAzureCredential 類型的實例。
  3. DefaultAzureCredential 類型的實例傳遞至 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)
    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>)
}