Sdílet prostřednictvím


Ověřování k prostředkům Azure z aplikací Go hostovaných v místním prostředí

Aplikace hostované mimo Azure (například místně nebo v datacentru třetí strany) by měly při přístupu k prostředkům Azure používat instanční objekt aplikace k ověřování v Azure. Objekty hlavního objektu služby aplikace se vytvářejí pomocí procesu registrace aplikace v Azure. Po vytvoření aplikačního principálu se pro vaši aplikaci vygeneruje ID klienta a klientský tajný klíč. ID klienta, tajný klíč klienta a ID vašeho tenanta se pak ukládají do proměnných prostředí, aby je mohli použít sada Azure SDK for Go k ověření aplikace v Azure za běhu.

Pro každé prostředí, ve které je aplikace hostovaná, by se měla vytvořit jiná registrace aplikace. To umožňuje nakonfigurovat pro každý instanční objekt oprávnění pro konkrétní prostředí a zajistit, aby aplikace nasazená do jednoho prostředí nemluvila s prostředky Azure, které jsou součástí jiného prostředí.

1. Registrace aplikace v Azure

Aplikaci je možné zaregistrovat v Azure pomocí webu Azure Portal nebo Azure CLI.

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

Výstup příkazu bude podobný následujícímu. Poznamenejte si tyto hodnoty nebo nechte toto okno otevřené, protože je budete potřebovat v dalších krocích a nebudete moct znovu zobrazit hodnotu hesla (tajný klíč 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. Přiřazení rolí k instančnímu objektu aplikace

Dále musíte určit, jaké role (oprávnění) vaše aplikace potřebuje k jakým prostředkům, a přiřadit tyto role k aplikaci. Role lze přiřadit na úrovni prostředku, skupiny prostředků nebo rozsahu předplatného. Tento příklad ukazuje, jak přiřadit role služebního hlavního objektu v rámci skupiny prostředků, protože většina aplikací seskupí všechny prostředky Azure do jedné skupiny prostředků.

Instančnímu objektu se přiřadí role v Azure pomocí příkazu az role assignment create.

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

Pokud chcete získat názvy rolí, ke kterým je možné instanční objekt přiřadit, použijte příkaz az role definition list.

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

Pokud například chcete aplikačnímu objektu služby s appId 00001111-aaaa-2222-bbbb-3333cccc4444 povolit čtení, zápis a odstranění přístupu ke kontejnerům objektů blob a datům v Azure Storage ve všech účtech úložiště ve skupině prostředků msdocs-go-sdk-auth-example v předplatném s ID aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e, přiřadili byste ho k roli Přispěvatel dat objektů blob úložiště pomocí následujícího příkazu.

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"

Informace o přiřazování oprávnění na úrovni prostředku nebo předplatného pomocí Azure CLI najdete v článku Přiřazení rolí Azure pomocí azure CLI.

3. Konfigurace proměnných prostředí pro aplikaci

Aby byly přihlašovací údaje hlavního objektu služby aplikace vašeho Go programu dostupné během běhu aplikace, musíte nastavit proměnné prostředí AZURE_CLIENT_ID, AZURE_TENANT_IDa AZURE_CLIENT_SECRET pro proces, který vaši aplikaci spouští. Objekt DefaultAzureCredential hledá informace o hlavním objektu služby v těchto proměnných prostředí.

Název proměnné Hodnota
AZURE_CLIENT_ID ID aplikace hlavního objektu služby Azure
AZURE_TENANT_ID ID tenanta aplikace Microsoft Entra
AZURE_CLIENT_SECRET Heslo služebního účtu Azure
export AZURE_TENANT_ID="<active_directory_tenant_id>"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_SECRET="<service_principal_password>"

4. Implementace DefaultAzureCredential v aplikaci

K ověřování klientských objektů sady Azure SDK v Azure by vaše aplikace měla použít typ DefaultAzureCredential z balíčku azidentity.

Začněte tím, že do aplikace přidáte balíček azidentity.

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

Dále budete chtít pro jakýkoli kód v jazyce Go, který ve vaší aplikaci vytvoří instanci klienta Azure SDK:

  1. Importujte balíček azidentity.
  2. Vytvořte instanci typu DefaultAzureCredential.
  3. Předejte instanci typu DefaultAzureCredential do konstruktoru klienta sady Azure SDK.

Příklad je znázorněn v následujícím segmentu kódu.

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

Když výše uvedený kód vytvoří instanci DefaultAzureCredential, potom DefaultAzureCredential přečte proměnné prostředí AZURE_TENANT_ID, AZURE_CLIENT_IDa AZURE_CLIENT_SECRET pro získání informací o aplikačním service principalu potřebném pro připojení k Azure.