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 Portal 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 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 00001111-aaaa-2222-bbbb-3333cccc4444
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 00001111-aaaa-2222-bbbb-3333cccc4444 \
--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 – Konfigurera miljövariabler för program
Du måste ange AZURE_CLIENT_ID
miljövariablerna , AZURE_TENANT_ID
och 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:
DefaultAzureCredential
Importera klassen från modulenazure.identity
.- Skapa ett
DefaultAzureCredential
objekt. - 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_ID
och AZURE_CLIENT_SECRET
för programtjänstens huvudnamnsinformation att ansluta till Azure med.