Udostępnij za pośrednictwem


Uwierzytelnianie w zasobach platformy Azure z poziomu aplikacji języka Go hostowanych lokalnie

Aplikacje hostowane poza platformą Azure (na przykład lokalnie lub w centrum danych innej firmy) powinny używać jednostki usługi aplikacji do uwierzytelniania na platformie Azure podczas uzyskiwania dostępu do zasobów platformy Azure. Obiekty główne serwisu aplikacji są tworzone za pomocą rejestracji w usłudze Azure. Po utworzeniu elementu usługi aplikacji dla Twojej aplikacji zostanie wygenerowany identyfikator klienta oraz klucz tajny klienta. Identyfikator klienta, klucz tajny klienta i identyfikator dzierżawy są następnie przechowywane w zmiennych środowiskowych, dzięki czemu mogą być używane przez zestaw Azure SDK dla języka Go do uwierzytelniania aplikacji na platformie Azure w czasie wykonywania.

Dla każdego środowiska hostowanego w aplikacji należy utworzyć inną rejestrację aplikacji. Umożliwia to skonfigurowanie uprawnień określonych zasobów środowiska dla każdej jednostki usługi i gwarantuje, że aplikacja wdrożona w jednym środowisku nie rozmawia z zasobami platformy Azure, które są częścią innego środowiska.

1 — Rejestrowanie aplikacji na platformie Azure

Aplikację można zarejestrować na platformie Azure przy użyciu witryny Azure Portal lub interfejsu wiersza polecenia platformy Azure.

az ad sp create-for-rbac --name <app-name>

Dane wyjściowe polecenia będą podobne do poniższych. Zanotuj te wartości lub pozostaw to okno otwarte, ponieważ te wartości będą potrzebne w następnych krokach i nie będą mogły ponownie wyświetlić wartości hasła (klucza tajnego klienta).

{
  "appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
  "displayName": "msdocs-python-sdk-auth-prod",
  "password": "Ee5Ff~6Gg7.-Hh8Ii9Jj0Kk1Ll2Mm3_Nn4Oo5Pp6",
  "tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}

2 — Przypisywanie ról do głównej jednostki usługi aplikacji

Następnie należy określić, jakich ról (uprawnień) potrzebuje twoja aplikacja na temat zasobów i przypisać te role do aplikacji. Rola może być przypisana do zasobu, grupy zasobów lub subskrypcji. W tym przykładzie pokazano, jak przypisać role dla jednostki usługi w zakresie grupy zasobów, ponieważ większość aplikacji grupuje wszystkie zasoby platformy Azure w jedną grupę zasobów.

Jednostka usługi ma przypisaną rolę na platformie Azure przy użyciu polecenia az role assignment create.

az role assignment create --assignee {appId} \
    --scope /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName} \
    --role "{roleName}" 

Aby uzyskać nazwy ról, do których można przypisać jednostkę usługi, użyj polecenia az role definition list.

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

Aby na przykład zezwolić jednostce usługi z identyfikatorem appId 00001111-aaaa-2222-bbbb-3333cccc4444 na odczyt, zapis i usuwanie danych w kontenerach obiektów blob usługi Azure Storage we wszystkich kontach magazynowych w grupie zasobów msdocs-go-sdk-auth-example w subskrypcji o identyfikatorze aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e, należy przypisać jednostkę usługi aplikacji do roli Kontrybutora Danych Blob Storage przy użyciu następującego polecenia.

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

Aby uzyskać informacje na temat przypisywania uprawnień na poziomie zasobu lub subskrypcji przy użyciu interfejsu wiersza polecenia platformy Azure, zobacz artykuł Przypisywanie ról platformy Azure przy użyciu interfejsu wiersza polecenia platformy Azure.

3 — Konfigurowanie zmiennych środowiskowych dla aplikacji

Należy ustawić zmienne środowiskowe AZURE_CLIENT_ID, AZURE_TENANT_IDi AZURE_CLIENT_SECRET dla procesu uruchamiającego aplikację Go, aby poświadczenia jednostki usługi były dostępne dla aplikacji w czasie jej działania. Obiekt DefaultAzureCredential szuka informacji o głównej usłudze w tych zmiennych środowiskowych.

Nazwa zmiennej Wartość
AZURE_CLIENT_ID Identyfikator aplikacji jednostki usługi platformy Azure
AZURE_TENANT_ID Identyfikator dzierżawy aplikacji Microsoft Entra
AZURE_CLIENT_SECRET Hasło głównej usługi platformy Azure
export AZURE_TENANT_ID="<active_directory_tenant_id>"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_SECRET="<service_principal_password>"

4 — Implementacja DefaultAzureCredential w aplikacji

Aby uwierzytelnić obiekty klienta zestawu Azure SDK na platformie Azure, aplikacja powinna używać typu DefaultAzureCredential z pakietu azidentity.

Zacznij od dodania pakietu azidentity do aplikacji.

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

Następnie, dla każdego kodu w języku Go, który tworzy klienta Azure SDK w twojej aplikacji, należy wykonać następujące kroki:

  1. Zaimportuj pakiet azidentity.
  2. Utwórz wystąpienie typu DefaultAzureCredential.
  3. Przekaż wystąpienie typu DefaultAzureCredential do konstruktora klienta zestawu Azure SDK.

Przykład jest pokazany w następującym segmencie kodu.

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>)
}

Gdy powyższy kod tworzy wystąpienie DefaultAzureCredential, wtedy DefaultAzureCredential odczytuje zmienne środowiskowe AZURE_TENANT_ID, AZURE_CLIENT_IDi AZURE_CLIENT_SECRET zawierające informacje o głównym użytkowniku usługi aplikacji, aby połączyć się z platformą Azure.