Dela via


Autentisera till Azure-resurser från Go-appar som finns lokalt

Appar som finns utanför Azure (till exempel lokalt eller i ett datacenter från tredje part) bör använda ett huvudnamn för programtjänsten för att autentisera till Azure vid åtkomst till Azure-resurser. Huvudobjekt för programtjänsten skapas med hjälp av appregistreringsprocessen i Azure. När ett huvudnamn för programtjänsten skapas genereras ett klient-ID och en klienthemlighet för din app. Klient-ID, klienthemlighet och ditt klient-ID lagras sedan i miljövariabler så att de kan användas av Azure SDK för Go för att autentisera din app till Azure vid körning.

En annan appregistrering ska skapas för varje miljö som appen finns i. Detta gör att miljöspecifika resursbehörigheter kan konfigureras för varje huvudnamn för tjänsten och ser till att en app som distribueras till en miljö inte kommunicerar med Azure-resurser som ingår i en annan miljö.

1 – Registrera programmet i Azure

En app kan registreras med Azure med hjälp av antingen Azure-portalen eller Azure CLI.

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

Kommandots utdata liknar följande. Anteckna dessa värden eller håll det här fönstret öppet eftersom du behöver dessa värden i nästa steg och inte kan visa lösenordet (klienthemligheten) igen.

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

2 – Tilldela roller till applikationstjänstens huvudkonto

Därefter måste du bestämma vilka roller (behörigheter) din app behöver på vilka resurser och tilldela dessa roller till din app. Roller kan tilldelas en roll i ett resurs-, resursgrupps- eller prenumerationsomfång. Det här exemplet visar hur du tilldelar roller för tjänstens huvudnamn i resursgruppens omfång eftersom de flesta program grupperar alla sina Azure-resurser i en enda resursgrupp.

Ett huvudnamn för tjänsten tilldelas en roll i Azure med hjälp av kommandot az role assignment create.

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

Om du vill hämta rollnamnen som ett huvudnamn för tjänsten kan tilldelas använder du kommandot az role definition list.

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

Om du till exempel vill tillåta tjänstens huvudkonto med appId 00001111-aaaa-2222-bbbb-3333cccc4444 för att läsa, skriva och ta bort åtkomst till Azure Storage-blobcontainrar och data i alla lagringskonton i resursgruppen msdocs-go-sdk-auth-example i prenumerationen med ID aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e, skulle du tilldela tjänstens huvudkonto till rollen Storage Blob Data Contributor med hjälp av följande kommando.

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"

Information om hur du tilldelar behörigheter på resurs- eller prenumerationsnivå med hjälp av Azure CLI finns i artikeln Tilldela Azure-roller med hjälp av Azure CLI-.

3 – Konfigurera miljövariabler för program

Du måste ange miljövariablerna AZURE_CLIENT_ID, AZURE_TENANT_IDoch AZURE_CLIENT_SECRET för den process som kör Go-appen för att göra autentiseringsuppgifterna för programtjänstens huvudnamn tillgängliga för din app vid körning. Det DefaultAzureCredential objektet söker efter informationen om tjänstens huvudnamn i dessa miljövariabler.

Variabelnamn Värde
AZURE_CLIENT_ID Applikations-ID för ett tjänsthuvudnamn i Azure
AZURE_TENANT_ID ID för applikationens Microsoft Entra-klient
AZURE_CLIENT_SECRET Lösenord för Azure-tjänstens huvudkonto
export AZURE_TENANT_ID="<active_directory_tenant_id>"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_SECRET="<service_principal_password>"

4 – Implementera DefaultAzureCredential i programmet

Om du vill autentisera Azure SDK-klientobjekt till Azure bör ditt program använda DefaultAzureCredential typ från azidentity-paketet.

Börja med att lägga till azidentity-paketet i ditt program.

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

För alla Go-kod som instansierar en Azure SDK-klient i din app vill du sedan:

  1. Importera azidentity-paketet.
  2. Skapa en instans av typen DefaultAzureCredential.
  3. Skicka instansen av DefaultAzureCredential typ till Azure SDK-klientkonstruktorn.

Ett exempel på detta visas i följande kodsegment.

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

När koden ovan instansierar DefaultAzureCredentialläser DefaultAzureCredential miljövariablerna AZURE_TENANT_ID, AZURE_CLIENT_IDoch AZURE_CLIENT_SECRET för programtjänstens huvudnamnsinformation att ansluta till Azure med.