Autentisera Azure-värdbaserade appar till Azure-resurser med Azure SDK för Python

När du är värd för en app i Azure med tjänster som Azure App Service, Azure Virtual Machines eller Azure Container Instances är den rekommenderade metoden för att autentisera en app till Azure-resurser med hanterad identitet.

En hanterad identitet tillhandahåller en identitet för din app så att den kan ansluta till andra Azure-resurser utan att behöva använda en hemlig nyckel eller annan programhemlighet. Internt känner Azure till identiteten för din app och vilka resurser den tillåts ansluta till. Azure använder den här informationen för att automatiskt hämta Microsoft Entra-token för appen så att den kan ansluta till andra Azure-resurser, allt utan att du behöver hantera några programhemligheter.

Kommentar

Appar som körs på Azure Kubernetes Service (AKS) kan använda en arbetsbelastningsidentitet för att autentisera med Azure-resurser. I AKS representerar en arbetsbelastningsidentitet en förtroenderelation mellan en hanterad identitet och ett Kubernetes-tjänstkonto. Om ett program som distribueras till AKS konfigureras med ett Kubernetes-tjänstkonto i en sådan relation autentiserar DefaultAzureCredential du appen till Azure med hjälp av den hanterade identiteten. Autentisering med hjälp av en arbetsbelastningsidentitet beskrivs i Använda Microsoft Entra-arbetsbelastnings-ID med Azure Kubernetes Service. Anvisningar om hur du konfigurerar arbetsbelastningsidentitet finns i Distribuera och konfigurera arbetsbelastningsidentitet i ett AKS-kluster (Azure Kubernetes Service).

Hanterade identitetstyper

Det finns två typer av hanterade identiteter:

  • Systemtilldelade hanterade identiteter – Den här typen av hanterad identitet tillhandahålls av och kopplas direkt till en Azure-resurs. När du aktiverar hanterad identitet på en Azure-resurs får du en systemtilldelad hanterad identitet för den resursen. En systemtilldelad hanterad identitet är kopplad till livscykeln för den Azure-resurs som den är associerad med. När resursen tas bort tar Azure automatiskt bort identiteten åt dig. Eftersom allt du behöver göra är att aktivera hanterad identitet för Den Azure-resurs som är värd för din kod, är den här metoden den enklaste typen av hanterad identitet att använda.
  • Användartilldelade hanterade identiteter – Du kan också skapa en hanterad identitet som en fristående Azure-resurs. Den här metoden används oftast när din lösning har flera arbetsbelastningar som körs på flera Azure-resurser som alla behöver dela samma identitet och samma behörigheter. Om din lösning till exempel hade komponenter som körs på flera Instanser av App Service och virtuella datorer som alla behöver åtkomst till samma uppsättning Azure-resurser, är en användartilldelad hanterad identitet som används för dessa resurser meningsfull.

Den här artikeln beskriver stegen för att aktivera och använda en systemtilldelad hanterad identitet för en app. Om du behöver använda en användartilldelad hanterad identitet kan du läsa artikeln Hantera användartilldelade hanterade identiteter för att se hur du skapar en användartilldelad hanterad identitet.

1 – Aktivera hanterad identitet i Azure-resursen som är värd för appen

Det första steget är att aktivera hanterad identitet på En Azure-resurs som är värd för din app. Om du till exempel är värd för ett Django-program med Azure App Service måste du aktivera hanterad identitet för App Service-webbappen som är värd för din app. Om du använder en virtuell dator som värd för din app gör du det möjligt för den virtuella datorn att använda hanterad identitet.

Du kan aktivera hanterad identitet som ska användas för en Azure-resurs med hjälp av antingen Azure Portal eller Azure CLI.

Azure CLI-kommandon kan köras i Azure Cloud Shell eller på en arbetsstation med Azure CLI installerat.

De Azure CLI-kommandon som används för att aktivera hanterad identitet för en Azure-resurs är av formatet az <command-group> identity --resource-group <resource-group-name> --name <resource-name>. Specifika kommandon för populära Azure-tjänster visas nedan.

az webapp identity assign --resource-group <resource-group-name> -name <web-app-name>

Utdata ser ut så här.

{
  "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
  "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
  "type": "SystemAssigned",
  "userAssignedIdentities": null
}

Värdet principalId är det unika ID:t för den hanterade identiteten. Behåll en kopia av dessa utdata eftersom du behöver dessa värden i nästa steg.

2 – Tilldela roller till den hanterade identiteten

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

En hanterad identitet tilldelas en roll i Azure med kommandot az role assignment create . För den tilldelade använder du den principalId du kopierade i steg 1.

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

Använd kommandot az role definition list för att hämta rollnamnen som ett huvudnamn för tjänsten kan tilldelas till.

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

Om du till exempel vill tillåta den hanterade identiteten med ID:t för läs-, skriv- och borttagningsåtkomst aaaaaaaa-bbbb-cccc-1111-222222222222 till Azure Storage-blobcontainrar och data i alla lagringskonton i resursgruppen msdocs-python-sdk-auth-example i prenumerationen med ID aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e, tilldelar du programtjänstens huvudnamn till rollen Storage Blob Data Contributor med hjälp av följande kommando.

az role assignment create --assignee aaaaaaaa-bbbb-cccc-1111-222222222222 \
    --scope /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-python-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 – Implementera DefaultAzureCredential i ditt program

När koden körs i Azure och den hanterade identiteten har aktiverats på Den Azure-resurs som är värd för din app avgör DefaultAzureCredential autentiseringsuppgifterna som ska användas i följande ordning:

  1. Kontrollera miljön för ett huvudnamn för tjänsten som definieras av miljövariablerna AZURE_CLIENT_ID, AZURE_TENANT_ID, och antingen AZURE_CLIENT_SECRET eller AZURE_CLIENT_CERTIFICATE_PATH och (valfritt) AZURE_CLIENT_CERTIFICATE_PASSWORD.
  2. Kontrollera nyckelordsparametrarna för en användartilldelad hanterad identitet. Du kan skicka in en användartilldelad hanterad identitet genom att ange dess klient-ID i parametern managed_identity_client_id .
  3. AZURE_CLIENT_ID Kontrollera miljövariabeln för klient-ID för en användartilldelad hanterad identitet.
  4. Använd den systemtilldelade hanterade identiteten för Azure-resursen om den är aktiverad.

Du kan undanta hanterade identiteter från autentiseringsuppgifterna genom att ange nyckelordsparametern exclude_managed_identity_credential True.

I den här artikeln använder vi den systemtilldelade hanterade identiteten för en Azure App Service-webbapp, så vi behöver inte konfigurera en hanterad identitet i miljön eller skicka in den som en parameter. Följande steg visar hur du använder DefaultAzureCredential.

Lägg först till paketet i azure.identity ditt program.

pip install azure-identity

För alla Python-kod som skapar ett Azure SDK-klientobjekt i din app vill du sedan:

  1. DefaultAzureCredential Importera klassen från modulenazure.identity.
  2. Skapa ett DefaultAzureCredential objekt.
  3. Skicka objektet DefaultAzureCredential till Azure SDK-klientobjektkonstruktorn.

Ett exempel på dessa steg visas i följande kodsegment.

from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient

# Acquire a credential object
token_credential = DefaultAzureCredential()

blob_service_client = BlobServiceClient(
        account_url="https://<my_account_name>.blob.core.windows.net",
        credential=token_credential)

Som beskrivs i översiktsartikeln azure SDK för Python-autentisering stöder DefaultAzureCredential flera autentiseringsmetoder och avgör vilken autentiseringsmetod som används vid körning. Fördelen med den här metoden är att din app kan använda olika autentiseringsmetoder i olika miljöer utan att implementera miljöspecifik kod. När föregående kod körs på din arbetsstation under den lokala utvecklingen DefaultAzureCredential använder du antingen ett huvudnamn för programtjänsten, baserat på miljöinställningar, eller autentiseringsuppgifter för utvecklarverktyg för att autentisera med andra Azure-resurser. Därför kan samma kod användas för att autentisera din app till Azure-resurser både under lokal utveckling och när den distribueras till Azure.