Dela via


Autentisera till Azure-resurser från Python-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 Python 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": "00000000-0000-0000-0000-000000000000",
  "displayName": "msdocs-python-sdk-auth-prod",
  "password": "abcdefghijklmnopqrstuvwxyz",
  "tenant": "33333333-3333-3333-3333-333333333333"
}

2 – Tilldela roller till programtjänstens huvudnamn

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 kommandot az role assignment create .

az role assignment create --assignee {appId} \
    --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 tjänstens huvudnamn med appId för läs-, skriv- och borttagningsåtkomst 00000000-0000-0000-0000-000000000000 till Azure Storage-blobcontainrar och data i alla lagringskonton i resursgruppen msdocs-python-sdk-auth-example i prenumerationen med ID 11111111-1111-1111-1111-111111111111, tilldelar du programtjänstens huvudnamn till rollen Storage Blob Data Contributor med hjälp av följande kommando.

az role assignment create --assignee 00000000-0000-0000-0000-000000000000 \
    --scope /subscriptions/11111111-1111-1111-1111-111111111111/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 – Konfigurera miljövariabler för program

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

När du använder Gunicorn för att köra Python-webbappar i en UNIX-servermiljö kan miljövariabler för en app anges med hjälp EnvironmentFile av direktivet i gunicorn.server filen enligt nedan.

[Unit]
Description=gunicorn daemon
After=network.target  
  
[Service]  
User=www-user
Group=www-data
WorkingDirectory=/path/to/python-app
EnvironmentFile=/path/to/python-app/py-env/app-environment-variables
ExecStart=/path/to/python-app/py-env/gunicorn --config config.py wsgi:app
            
[Install]  
WantedBy=multi-user.target

Filen som anges i EnvironmentFile direktivet ska innehålla en lista över miljövariabler med deras värden enligt nedan.

AZURE_CLIENT_ID=<value>
AZURE_TENANT_ID=<value>
AZURE_CLIENT_SECRET=<value>

4 – Implementera DefaultAzureCredential i programmet

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

Börja med att lägga till paketet azure.identity i 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å detta 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)

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