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_ID
och 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:
- Importera
azidentity
-paketet. - Skapa en instans av typen
DefaultAzureCredential
. - 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 DefaultAzureCredential
läser DefaultAzureCredential
miljövariablerna AZURE_TENANT_ID
, AZURE_CLIENT_ID
och AZURE_CLIENT_SECRET
för programtjänstens huvudnamnsinformation att ansluta till Azure med.