Ottenere i token ID di Microsoft Entra per gli utenti tramite MSAL
Importante
Questo articolo descrive come creare manualmente i token ID di Microsoft Entra usando Microsoft Authentication Library (MSAL).
Databricks non consiglia di creare manualmente i token ID di Microsoft Entra per gli utenti di Azure Databricks. Ciò è dovuto al fatto che ogni token ID di Microsoft Entra è di breve durata, in genere scaduto entro un'ora. Dopo questa volta, è necessario generare manualmente un token ID Microsoft Entra sostitutivo. Usare invece uno degli strumenti o degli SDK partecipanti che implementano lo standard di autenticazione unificata del client Databricks. Questi strumenti e SDK generano e sostituiscono automaticamente i token ID Microsoft Entra scaduti, sfruttando l'autenticazione dell'interfaccia della riga di comando di Azure.
Le entità servizio gestite di Azure Databricks vengono gestite direttamente in Azure Databricks. Le entità servizio gestite da Microsoft Entra ID vengono gestite in Microsoft Entra ID, che richiede autorizzazioni aggiuntive. Databricks consiglia di usare le entità servizio gestite di Azure Databricks per la maggior parte dei casi d'uso. Tuttavia, Databricks consiglia di usare le entità servizio gestite con ID Microsoft Entra nei casi in cui è necessario eseguire l'autenticazione con Azure Databricks e altre risorse di Azure contemporaneamente.
Per creare un'entità servizio gestita di Azure Databricks anziché un'entità servizio gestita con ID Microsoft Entra, vedere Gestire le entità servizio.
È possibile usare Microsoft Authentication Library (MSAL) per acquisire i token di accesso di Microsoft Entra ID a livello di codice. Questo articolo descrive l'utilizzo di base della libreria MSAL e gli input utente necessari, con esempi python.
Nota
MSAL sostituisce Microsoft Entra ID Authentication Library (ADAL). Tutto il supporto e lo sviluppo Microsoft per ADAL, incluse le correzioni di sicurezza, è terminato il 30 giugno 2022. Vedere Eseguire la migrazione di applicazioni a Microsoft Authentication Library (MSAL).
Suggerimento
È possibile provare a usare l'interfaccia della riga di comando di Azure anziché MSAL per ottenere i token ID Di Microsoft Entra per gli utenti, perché l'uso dell'interfaccia della riga di comando di Azure richiede meno passaggi. Vedere Ottenere i token ID di Microsoft Entra per gli utenti usando l'interfaccia della riga di comando di Azure.
È anche possibile definire un'entità servizio in Microsoft Entra ID e ottenere un token di accesso microsoft Entra ID per l'entità servizio anziché per un utente. Vedere Ottenere i token ID Di Microsoft Entra per le entità servizio.
Configurare un'app in portale di Azure
Registrare un'applicazione con l'endpoint MICROSOFT Entra ID nel portale di Azure. In alternativa, è possibile usare un'app Microsoft Entra ID già registrata. Per altre informazioni, vedere Registrare un'app usando il portale di Azure.
Accedere al portale di Azure.
Nota
Il portale da usare è diverso a seconda che l'applicazione Microsoft Entra ID venga eseguita nel cloud pubblico di Azure o in un cloud nazionale o sovrano. Per altre informazioni, vedere Cloud nazionali.
Se si ha accesso a più tenant, sottoscrizioni o directory, fare clic sull'icona Directory e sottoscrizioni (directory con filtro) nel menu in alto per passare alla directory in cui si vuole registrare l'applicazione.
Cercare e selezionare Microsoft Entra ID.
In Gestisci selezionare Registrazioni app > Nuova registrazione.
In Nome immettere un nome per l'applicazione.
Nella sezione Tipi di account supportati selezionare Account solo in questa directory organizzativa (tenant singolo).
Nella sezione URI di reindirizzamento (facoltativo) selezionare Client pubblico/nativo (mobile e desktop) e immettere un URI di reindirizzamento. Nell'esempio seguente il valore dell'URI di reindirizzamento è
http://localhost
.Fare clic su Registra.
Nella pagina Panoramica della pagina dell'applicazione copiare i valori seguenti nella sezione Informazioni di base:
- ID applicazione (client)
- ID della directory (tenant)
- In URI di reindirizzamento l'URI di reindirizzamento del client pubblico immesso in precedenza in questa procedura.
Aggiungere AzureDatabricks alle autorizzazioni necessarie dell'applicazione registrata. Per eseguire questo passaggio, è necessario essere un utente amministratore. Se si verifica un problema relativo alle autorizzazioni durante l'esecuzione di questa azione, contattare l'amministratore per assistenza.
Nella scheda Attività iniziali della pagina dell'applicazione fare clic su Visualizza autorizzazioni API.
Fare clic su Aggiungi un'autorizzazione.
Nel riquadro Richiedi autorizzazioni API fare clic sulla scheda API usate dall'organizzazione, cercare AzureDatabricks e quindi selezionarla.
Abilitare la casella di controllo user_impersonation e quindi fare clic su Aggiungi autorizzazioni.
Fare clic su Concedi consenso amministratore per ### e quindi su Sì. Per eseguire questa azione, è necessario essere un utente amministratore o avere il privilegio di concedere il consenso all'applicazione. Se non viene visualizzato Concedi il consenso amministratore per ###o se si ignora questa azione, è necessario usare il flusso del codice di autorizzazione (interattivo) la prima volta che si usa l'applicazione per fornire il consenso. Successivamente, è possibile usare il metodo Flusso username-password (programmatico).
È possibile aggiungere altri utenti all'applicazione. Per altre informazioni, vedere Assegnare un account utente a un'applicazione aziendale per portale di Azure istruzioni o Assegnare utenti e gruppi a un'applicazione in Microsoft Entra ID (in precedenza Azure Active Directory) per le istruzioni di PowerShell. Un utente non sarà in grado di ottenere un token senza autorizzazioni necessarie.
Ottenere un token di accesso di Microsoft Entra ID
Per ottenere un token di accesso di Microsoft Entra ID, è possibile usare:
È necessario usare il flusso del codice di autorizzazione (interattivo) per ottenere il token di accesso microsoft Entra ID se:
- L'autenticazione a due fattori è abilitata in Microsoft Entra ID.
- L'autenticazione federata è abilitata in Microsoft Entra ID.
- Non viene concesso il consenso all'applicazione registrata durante la registrazione dell'applicazione.
Se si dispone dell'autorità per accedere con un nome utente e una password, è possibile usare il flusso username-password (programmatico) per ottenere un token di accesso microsoft Entra ID.
Flusso del codice di autorizzazione (interattivo)
Esistono due passaggi per acquisire un token di accesso di Microsoft Entra ID usando il flusso del codice di autorizzazione.
- Richiedere un codice di autorizzazione, che avvia una finestra del browser e richiede l'accesso utente di Azure. Il codice di autorizzazione viene restituito dopo l'accesso dell'utente.
- Usare il codice di autorizzazione per acquisire il token di accesso microsoft Entra ID. A seconda dell'approccio usato, è anche possibile restituire un token di aggiornamento contemporaneamente e può essere usato per aggiornare il token di accesso microsoft Entra ID.
Un approccio per completare questi due passaggi consiste nell'usare il Web browser e curl. A tale scopo, usare il Web browser per ottenere il codice di autorizzazione e quindi usare il codice di autorizzazione e curl
ottenere il token di accesso microsoft Entra ID. Questo approccio non fornisce un token di aggiornamento.
Un altro approccio consiste nell'usare la libreria PYTHON MSAL. A tale scopo, si esegue un singolo script che usa il Web browser per ottenere il codice di autorizzazione e quindi usa il codice di autorizzazione per ottenere sia un token di accesso che di aggiornamento.
Entrambi questi approcci presuppongono che l'accesso ad Azure sia già stato eseguito. Se non è stato eseguito l'accesso, il Web browser chiederà di farlo.
Ottenere i token ID di Microsoft Entra usando un Web browser e curl
Raccogliere le seguenti informazioni:
Parametro Descrizione ID tenant ID directory (tenant) per l'applicazione correlata registrata in Microsoft Entra ID in Configurare un'app in portale di Azure. ID client ID applicazione (client) per l'applicazione correlata registrata in Microsoft Entra ID. URI di reindirizzamento URI di reindirizzamento appropriati per l'applicazione correlata registrata in Microsoft Entra ID (ad esempio, http://localhost
). Le risposte di autenticazione vengono inviate a questo URI con il codice di autorizzazione incluso.Ottenere il codice di autorizzazione usando il Web browser per passare all'URL seguente. Sostituire di conseguenza i campi nell'esempio di URL seguente. Si noti che l'URL deve essere inviato come singola riga; le interruzioni di riga sono state aggiunte all'URL seguente per migliorare la leggibilità. Per altre informazioni, vedere Richiedere un codice di autorizzazione.
https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/authorize?client_id=<client-id> &response_type=code &redirect_uri=<redirect-uri> &response_mode=query &scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default &state=<state>
Replace:
<tenant-id>
con l'ID tenant dell'applicazione registrata.<client-id>
con l'ID client dell'applicazione registrata.<redirect-uri>
con l'URI di reindirizzamento dell'applicazione registrata. Questo URI deve essere in formato con codifica URL (percent-encoded). Ad esempio,http://localhost
èhttp%3A%2F%2Flocalhost
.<state>
con un numero casuale o alcune informazioni codificate. Per verificare l'integrità dello scambio di informazioni, questo valore di stato deve corrispondere a quello presente nell'URL restituito più avanti in questa procedura.
Non modificare il valore del
scope
parametro. Rappresenta l'ID programmatico per Azure Databricks (2ff814a6-3304-4ab8-85cb-cd0e6f879c1d
) insieme all'ambito predefinito (/.default
con codifica URL come%2f.default
).Ad esempio:
https://login.microsoftonline.com/a1bc2d34-5e67-8f89-01ab-c2345d6c78de/oauth2/v2.0/authorize?client_id=12a34b56-789c-0d12-e3fa-b456789c0123 &response_type=code &redirect_uri=http%3A%2F%2Flocalhost &response_mode=query &scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default &state=12345
Incollare l'URL come singola riga nel Web browser e, se richiesto, accedere ad Azure.
Il codice di autorizzazione si trova nel
code
campo nell'URL restituito. Salvare il codice di autorizzazione in un percorso sicuro. Verificare inoltre che il valore delstate
campo corrisponda a quello fornito in precedenza in questa procedura.L'URL completo restituito avrà un aspetto simile al seguente (con il valore del campo completo
code
abbreviato0.ASkAIj...RxgFhSAA
qui per brevità):http://localhost/?code=0.ASkAIj...RxgFhSAA&state=12345&session_state=c44574d5-38ba-4f93-b2a3-a830db8e8cdf
Usare il codice di autorizzazione insieme
curl
a per ottenere il token di accesso microsoft Entra ID.curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \ https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/token \ -d 'client_id=<client-id>' \ -d 'scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default' \ -d 'code=<authorization-code>' \ -d 'redirect_uri=<redirect-uri>' \ -d 'grant_type=authorization_code' \ -d 'state=<state>'
Replace:
<tenant-id>
con l'ID tenant dell'applicazione registrata.<client-id>
con l'ID client dell'applicazione registrata.<authorization-code>
con il codice di autorizzazione.<redirect-uri>
con l'URI di reindirizzamento dell'applicazione registrata. Questo URI deve essere in formato con codifica URL (percent-endoded). Ad esempio,http://localhost
èhttp%3A%2F%2Flocalhost
.<state>
con un numero casuale o alcune informazioni codificate. Per verificare l'integrità dello scambio di informazioni, questo valore di stato deve corrispondere a quello presente nel payload della risposta più avanti in questa procedura.
Non modificare il valore del
scope
parametro. Rappresenta l'ID programmatico per Azure Databricks (2ff814a6-3304-4ab8-85cb-cd0e6f879c1d
) insieme all'ambito predefinito (/.default
con codifica URL come%2f.default
).Ad esempio:
curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \ https://login.microsoftonline.com/a1bc2d34-5e67-8f89-01ab-c2345d6c78de/oauth2/v2.0/token \ -d 'client_id=12a34b56-789c-0d12-e3fa-b456789c0123' \ -d 'scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default' \ -d 'code=0.ASkAIj...RxgFhSAA' \ -d 'redirect_uri=http%3A%2F%2Flocalhost' \ -d 'grant_type=authorization_code' \ -d 'state=12345'
Il token ID Microsoft Entra è nel
access_token
valore all'interno del risultato della chiamata. Assicurarsi di verificare che ilstate
valore corrisponda a quello fornito in precedenza in questa procedura.
Ottenere i token ID di Microsoft Entra usando la libreria Python MSAL
Raccogliere le seguenti informazioni:
Parametro Descrizione ID tenant ID directory (tenant) per l'applicazione correlata registrata in Microsoft Entra ID in Configurare un'app in portale di Azure. ID client ID applicazione (client) per l'applicazione correlata registrata in Microsoft Entra ID. Questa procedura presuppone che l'utente abbia impostato
http://localhost
come URI di reindirizzamento per l'applicazione correlata registrata in Microsoft Entra ID.Installare MSAL Python SDK nel computer locale eseguendo
pip install msal
.Salvare il codice seguente come
get-tokens.py
nel computer locale.# Given the client ID and tenant ID for an app registered in Azure, # provide a <ms-entra-id> access token and a refresh token. # If the caller is not already signed in to Azure, the caller's # web browser will prompt the caller to sign in first. # pip install msal from msal import PublicClientApplication import sys # You can hard-code the registered app's client ID and tenant ID here, # or you can provide them as command-line arguments to this script. client_id = '<client-id>' tenant_id = '<tenant-id>' # Do not modify this variable. It represents the programmatic ID for # Azure Databricks along with the default scope of '/.default'. scopes = [ '2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default' ] # Check for too few or too many command-line arguments. if (len(sys.argv) > 1) and (len(sys.argv) != 3): print("Usage: get-tokens.py <client ID> <tenant ID>") exit(1) # If the registered app's client ID and tenant ID are provided as # command-line variables, set them here. if len(sys.argv) > 1: client_id = sys.argv[1] tenant_id = sys.argv[2] app = PublicClientApplication( client_id = client_id, authority = "https://login.microsoftonline.com/" + tenant_id ) acquire_tokens_result = app.acquire_token_interactive( scopes = scopes ) if 'error' in acquire_tokens_result: print("Error: " + acquire_tokens_result['error']) print("Description: " + acquire_tokens_result['error_description']) else: print("Access token:\n") print(acquire_tokens_result['access_token']) print("\nRefresh token:\n") print(acquire_tokens_result['refresh_token'])
Esegui una delle operazioni seguenti:
- Nel codice precedente sostituire
<client-id>
con l'ID client dell'applicazione registrata e<tenant-id>
con l'ID tenant dell'applicazione registrata, quindi eseguire lo script, ad esempiopython get-tokens.py
. - Specificare l'ID client dell'applicazione registrata e l'ID tenant dell'applicazione registrata quando si esegue lo script, ad esempio
python get-tokens.py 12a34b56-789c-0d12-e3fa-b456789c0123 a1bc2d34-5e67-8f89-01ab-c2345d6c78de
.
- Nel codice precedente sostituire
Se il Web browser richiede l'accesso ad Azure.
I token di accesso e aggiornamento di Microsoft Entra ID vengono stampati nell'output.
Flusso username-password (programmatico)
Se si dispone dell'autorità per accedere con un nome utente e una password, raccogliere le informazioni seguenti:
Parametro Descrizione ID tenant ID directory (tenant) per l'applicazione correlata registrata in Microsoft Entra ID in Configurare un'app in portale di Azure. ID client ID applicazione (client) per l'applicazione reale registrata in Microsoft Entra ID. Nome utente e password Il nome utente (ovvero l'indirizzo di posta elettronica quando si accede a portale di Azure) e la password dell'utente nel tenant. Questa procedura presuppone che l'utente abbia impostato
http://localhost
come URI di reindirizzamento per l'applicazione correlata registrata in Microsoft Entra ID.Installare MSAL Python SDK nel computer locale eseguendo
pip install msal
.Salvare il codice seguente come
get-tokens-for-user.py
nel computer locale.# Given the client ID and tenant ID for an app registered in Azure, # along with an Azure username and password, # provide a <ms-entra-id> access token and a refresh token. # If the caller is not already signed in to Azure, the caller's # web browser will prompt the caller to sign in first. # pip install msal from msal import PublicClientApplication import sys # You can hard-code the registered app's client ID and tenant ID here, # along with the Azure username and password, # or you can provide them as command-line arguments to this script. client_id = '<client-id>' tenant_id = '<tenant-id>' username = '<username>' password = '<password>' # Do not modify this variable. It represents the programmatic ID for # Azure Databricks along with the default scope of '/.default'. scope = [ '2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default' ] # Check for too few or too many command-line arguments. if (len(sys.argv) > 1) and (len(sys.argv) != 5): print("Usage: get-tokens-for-user.py <client ID> <tenant ID> <username> <password>") exit(1) # If the registered app's client ID and tenant ID along with the # Azure username and password are provided as command-line variables, # set them here. if len(sys.argv) > 1: client_id = sys.argv[1] tenant_id = sys.argv[2] username = sys.argv[3] password = sys.argv[4] app = PublicClientApplication( client_id = client_id, authority = "https://login.microsoftonline.com/" + tenant_id ) acquire_tokens_result = app.acquire_token_by_username_password( username = username, password = password, scopes = scope ) if 'error' in acquire_tokens_result: print("Error: " + acquire_tokens_result['error']) print("Description: " + acquire_tokens_result['error_description']) else: print("Access token:\n") print(acquire_tokens_result['access_token']) print("\nRefresh token:\n") print(acquire_tokens_result['refresh_token'])
Esegui una delle operazioni seguenti:
- Nel codice precedente sostituire
<client-id>
con l'ID client dell'applicazione registrata,<tenant-id>
con l'ID tenant dell'applicazione registrata,<username>
con il nome utente e<password>
con la password, quindi eseguire lo script, ad esempiopython get-tokens-for-user.py
. - Specificare l'ID client dell'applicazione registrata, l'ID tenant dell'applicazione registrata, il nome utente e la password quando si esegue lo script, ad esempio
python get-tokens-for-user.py 12a34b56-789c-0d12-e3fa-b456789c0123 a1bc2d34-5e67-8f89-01ab-c2345d6c78de someone@example.com "MyPa55w&rd!"
. Se un argomento della riga di comando contiene caratteri speciali, è consigliabile racchiuderlo tra virgolette.
- Nel codice precedente sostituire
I token di accesso e aggiornamento di Microsoft Entra ID vengono stampati nel terminale.
Usare un token di accesso di Microsoft Entra ID per accedere all'API REST di Databricks
Questa sezione descrive come usare un token di accesso di Microsoft Entra ID per chiamare l'API REST di Databricks. Negli esempi seguenti sostituire <access-token>
con il token di accesso microsoft Entra ID e <databricks-instance>
con l'URL per area di lavoro della distribuzione di Azure Databricks.
Esempio in Python
Questo esempio illustra come elencare i cluster in un'area di lavoro di Azure Databricks.
import requests
import json
databricks_instance = '<databricks-instance>'
api_version = '/api/2.0'
api_command = '/clusters/list'
url = f"https://{databricks_instance}{api_version}{api_command}"
access_token = '<access-token>'
response = requests.get(
url = url,
headers = { 'Authorization': "Bearer " + access_token}
)
print(json.dumps(json.loads(response.text), indent = 2))
Nota
Se si è un utente non amministratore e si vuole accedere come utente amministratore, è necessario specificare l'intestazione X-Databricks-Azure-Workspace-Resource-Id
oltre all'intestazione 'Authorization' : 'Bearer '
ed essere in un ruolo Collaboratore o Proprietario nella risorsa dell'area di lavoro in Azure. Il valore viene costruito X-Databricks-Azure-Workspace-Resource-Id
nel modo seguente:
# ...
subscription = '<azure-subscription-id>'
resource_group = '<azure-resource-group-name>'
workspace = '<databricks-workspace-name-in-azure>'
db_resource_id = '/subscriptions/%s/resourcegroups/%s/providers/microsoft.databricks/workspaces/%s' % (
subscription,
resource_group,
workspace
)
# ...
headers = {
'Authorization': "Bearer " + access_token,
'X-Databricks-Azure-Workspace-Resource-Id': db_resource_id
}
# ...
Per ottenere le informazioni su sottoscrizione, risorsa e area di lavoro in Azure, vedere Aprire le risorse. Per aprire la risorsa di destinazione, è possibile cercare il tipo di servizio Azure Databricks e tutte le altre informazioni in Azure che si conoscono sull'area di lavoro di Azure Databricks di destinazione.
curl
esempio
curl -X GET \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <access-token>' \
https://<databricks-instance>/api/2.0/clusters/list
Aggiornare un token di accesso a Microsoft Entra ID
Se si ottiene un token di aggiornamento insieme al token di accesso microsoft Entra ID, è possibile usare il token di aggiornamento per ottenere un nuovo token. Per impostazione predefinita, la durata dei token di accesso a Microsoft Entra ID è un periodo di tempo casuale compreso tra 60 e 90 minuti (75 minuti in media). È possibile configurare la durata dei token di accesso di Microsoft Entra ID usando i metodi descritti in Durata dei token configurabili in Microsoft Entra ID (in precedenza Azure Active Directory).
L'esempio seguente illustra come usare la libreria Python MSAL insieme a un token di aggiornamento per ottenere un nuovo token.
Salvare il codice seguente come
refresh-tokens.py
nel computer locale.# Given the client ID and tenant ID for an app registered in Azure, # along with a refresh token, provide a new <ms-entra-id> access token and # refresh token. # If the caller is not already signed in to Azure, the caller's # web browser will prompt the caller to sign in first. # pip install msal from msal import PublicClientApplication import sys # You can hard-code the registered app's client ID, tenant ID, # and refresh token here, or you can provide them as command-line # arguments to this script. client_id = '<client-id>' tenant_id = '<refresh-token' refresh_token = '<refresh-token>' # Do not modify this variable. It represents the programmatic ID for # Azure Databricks along with the default scope of '.default'. scope = [ '2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default' ] # Check for too few or too many command-line arguments. if (len(sys.argv) > 1) and (len(sys.argv) != 4): print("Usage: refresh-tokens.py <client ID> <tenant ID> <refresh token>") exit(1) # If the registered app's client ID, tenant ID, and refresh token are # provided as command-line variables, set them here. if len(sys.argv) > 1: client_id = sys.argv[1] tenant_id = sys.argv[2] refresh_token = sys.argv[3] app = PublicClientApplication( client_id = client_id, authority = "https://login.microsoftonline.com/" + tenant_id ) acquire_tokens_result = app.acquire_token_by_refresh_token( refresh_token = refresh_token, scopes = scope ) if 'error' in acquire_tokens_result: print("Error: " + acquire_tokens_result['error']) print("Description: " + acquire_tokens_result['error_description']) else: print("\nNew access token:\n") print(acquire_tokens_result['access_token']) print("\nNew refresh token:\n") print(acquire_tokens_result['refresh_token'])
Esegui una delle operazioni seguenti:
- Nel codice precedente sostituire
<client-id>
con l'ID client dell'applicazione registrata,<tenant-id>
con l'ID tenant dell'applicazione registrata e<refresh-token>
con il token di aggiornamento, quindi eseguire lo script, ad esempiopython get-tokens-for-user.py
. - Specificare l'ID client dell'applicazione registrata, l'ID tenant dell'applicazione registrata e il token di aggiornamento quando si esegue lo script, ad esempio
python refresh-tokens.py 12a34b56-789c-0d12-e3fa-b456789c0123 a1bc2d34-5e67-8f89-01ab-c2345d6c78de "0.ASkAIj...huE84ALg"
. Se un argomento della riga di comando contiene caratteri speciali, è consigliabile racchiuderlo tra virgolette.
- Nel codice precedente sostituire
I nuovi token di accesso e aggiornamento di Microsoft Entra ID vengono stampati nel terminale.