Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Le app ospitate al di fuori di Azure (ad esempio in sede o in un data center di terze parti) devono usare un principale del servizio applicativo per autenticarsi in Azure quando accedono alle risorse di Azure. Gli oggetti principali di servizio delle applicazioni vengono creati tramite il processo di registrazione delle applicazioni in Azure. Quando viene creato un principale del servizio dell'applicazione, viene generato un ID cliente e un segreto cliente per l'app. L'ID client, il segreto client e l'ID tenant vengono quindi archiviati in variabili di ambiente in modo che possano essere usati da Azure SDK per Python per autenticare l'app in Azure in fase di esecuzione.
È necessario creare una registrazione dell'app diversa per ogni ambiente in cui l'app è ospitata. In questo modo è possibile configurare autorizzazioni di risorse specifiche dell'ambiente per ogni entità servizio e assicurarsi che un'app distribuita in un ambiente non parli con le risorse di Azure che fanno parte di un altro ambiente.
1 - Registrare l'applicazione in Azure
Un'app può essere registrata con Azure usando il portale di Azure o l'interfaccia della riga di comando di Azure.
APP_NAME=<app-name>
az ad sp create-for-rbac --name $APP_NAME
L'output del comando è simile al seguente. Prendere nota di questi valori o mantenere aperta questa finestra perché questi valori saranno necessari nei passaggi successivi e non saranno più in grado di visualizzare di nuovo il valore della password (segreto client).
{
"appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"displayName": "msdocs-python-sdk-auth-prod",
"password": "Ee5Ff~6Gg7.-Hh8Ii9Jj0Kk1Ll2Mm3_Nn4Oo5Pp6",
"tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}
Successivamente, è necessario ottenere il appID
valore e archiviarlo in una variabile. Questo valore viene usato per impostare le variabili di ambiente nell'ambiente di sviluppo locale in modo che Azure SDK per Python possa eseguire l'autenticazione in Azure usando l'entità servizio.
APP_ID=$(az ad sp create-for-rbac \
--name $APP_NAME --query appId --output tsv)
2 - Assegnare ruoli al principale del servizio dell'applicazione
Successivamente, è necessario determinare i ruoli (autorizzazioni) necessari per l'app in base alle risorse e assegnare tali ruoli all'app. I ruoli possono essere assegnati a una risorsa, a un gruppo di risorse o a una sottoscrizione. Questo esempio illustra come assegnare ruoli per l'entità servizio nell'ambito del gruppo di risorse perché la maggior parte delle applicazioni raggruppa tutte le risorse di Azure in un singolo gruppo di risorse.
A un'entità servizio viene assegnato un ruolo in Azure usando il comando az role assignment create.
RESOURCE_GROUP_NAME=<resource-group-name>
SUBSCRIPTION_ID=$(az account show --query id --output tsv)
ROLE_NAME=<role-name>
az role assignment create \
--assignee "$APP_ID" \
--scope "./subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME" \
--role "$ROLE_NAME"
! [! NOTA] Per impedire a Git Bash di trattare /subscriptions/... come percorso del file, anteporre ./ alla stringa per il
scope
parametro e usare virgolette doppie intorno all'intera stringa.
Per ottenere i nomi dei ruoli a cui è possibile assegnare un principale del servizio, utilizzare il comando az role definition list.
az role definition list \
--query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
--output table
Ad esempio, per consentire all'entità servizio con il valore appId di 00001111-aaaa-2222-bbbb-3333cccc4444
accesso in lettura, scrittura ed eliminazione ai contenitori BLOB e dati in Archiviazione di Azure in tutti gli account di archiviazione nel gruppo di risorse msdocs-python-sdk-auth-example nella sottoscrizione con ID aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
, si assegnerebbe l'entità servizio dell'applicazione al ruolo Collaboratore ai dati dei BLOB di Archiviazione utilizzando il comando seguente.
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"
Per informazioni sull'assegnazione delle autorizzazioni a livello di risorsa o sottoscrizione tramite l'interfaccia della riga di comando di Azure, vedere l'articolo Assegnare ruoli di Azure usando l'interfaccia della riga di comando di Azure.
3 - Configurare le variabili di ambiente per l'applicazione
È necessario impostare le AZURE_CLIENT_ID
variabili di ambiente , AZURE_TENANT_ID
e AZURE_CLIENT_SECRET
per il processo che esegue l'app Python per rendere le credenziali dell'entità servizio dell'applicazione disponibili per l'app in fase di esecuzione. L'oggetto DefaultAzureCredential
cerca le informazioni sull'entità servizio in queste variabili di ambiente.
Quando si usa Gunicorn per eseguire app Web Python in un ambiente server UNIX, le variabili di ambiente per un'app possono essere specificate usando la EnvironmentFile
direttiva nel gunicorn.server
file, come illustrato di seguito.
[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
Il file specificato nella EnvironmentFile
direttiva deve contenere un elenco di variabili di ambiente con i relativi valori, come illustrato di seguito.
AZURE_CLIENT_ID=<value>
AZURE_TENANT_ID=<value>
AZURE_CLIENT_SECRET=<value>
4 - Implementare DefaultAzureCredential nell'applicazione
Per autenticare gli oggetti client di Azure SDK in Azure, l'applicazione deve usare la DefaultAzureCredential
classe del azure.identity
pacchetto.
Per iniziare, aggiungere il pacchetto azure.identity all'applicazione.
pip install azure-identity
Successivamente, per qualsiasi codice Python che crea un oggetto client Azure SDK nell'app, è necessario:
- Importare la
DefaultAzureCredential
classe dalazure.identity
modulo. - Creare un oggetto
DefaultAzureCredential
. - Passare l'oggetto
DefaultAzureCredential
al costruttore dell'oggetto client di Azure SDK.
Un esempio è illustrato nel segmento di codice seguente.
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)
Quando il codice precedente crea un'istanza dell'oggetto DefaultAzureCredential
, DefaultAzureCredential
legge le variabili di ambiente AZURE_TENANT_ID
, AZURE_CLIENT_ID
e AZURE_CLIENT_SECRET
per ottenere le informazioni principali del servizio applicazione con cui connettersi ad Azure.