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.
Il flusso di concessione delle credenziali client OAuth 2.0 consente a un servizio Web (client riservato) di usare le proprie credenziali, anziché rappresentare un utente, per l'autenticazione quando si chiama un altro servizio Web. La concessione specificata in RFC 6749, talvolta denominata OAuth a due zampe, può essere usata per accedere alle risorse ospitate sul Web usando l'identità di un'applicazione. Questo tipo viene comunemente usato per le interazioni da server a server che devono essere eseguite in background, senza interazione immediata con un utente e viene spesso definito daemon o account di servizio.
Nel flusso delle credenziali client, le autorizzazioni vengono concesse direttamente all'applicazione stessa da un amministratore. Quando l'app presenta un token a una risorsa, la risorsa impone che l'app stessa abbia l'autorizzazione per eseguire un'azione poiché non è presente alcun utente coinvolto nell'autenticazione. Questo articolo illustra entrambi i passaggi necessari per:
Questo articolo descrive come programmare direttamente con il protocollo nella tua applicazione. Quando possibile, è consigliabile usare le librerie di autenticazione Microsoft supportate (MSAL) per acquisire i token e chiamare api Web protette. È anche possibile fare riferimento alle app di esempio che usano MSAL. Come nota laterale, i token di aggiornamento non verranno mai concessi con questo flusso come client_id
e client_secret
(che sarebbe necessario per ottenere un token di aggiornamento) possono essere usati per ottenere invece un token di accesso.
Per un livello di garanzia superiore, Microsoft Identity Platform consente anche al servizio chiamante di eseguire l'autenticazione usando un certificato o credenziali federate anziché un segreto condiviso. Poiché vengono usate le credenziali proprie dell'applicazione, queste credenziali devono essere mantenute al sicuro. Non pubblicare mai tali credenziali nel codice sorgente, incorporarlo in pagine Web o usarlo in un'applicazione nativa ampiamente distribuita.
Diagramma del protocollo
L'intero flusso delle credenziali client è simile al diagramma seguente. Descriviamo ciascuno dei passaggi più avanti in questo articolo.
Ottenere l'autorizzazione diretta
Un'app riceve in genere l'autorizzazione diretta per accedere a una risorsa in uno dei due modi seguenti:
- Tramite un elenco di controllo di accesso (ACL) nella risorsa
- Tramite l'assegnazione delle autorizzazioni dell'applicazione in Microsoft Entra ID
Questi due metodi sono i più comuni in Microsoft Entra ID ed è consigliabile per i client e le risorse che eseguono il flusso delle credenziali client. Una risorsa può anche scegliere di autorizzare i client in altri modi. Ogni server di risorse può scegliere il metodo più appropriato per l'applicazione.
Elenchi di controllo di accesso
Un provider di risorse potrebbe applicare un controllo di autorizzazione in base a un elenco di ID applicazione (client) a cui riconosce e concede un livello di accesso specifico. Quando la risorsa riceve un token dalla piattaforma di identità di Microsoft, può decodificare il token ed estrarre l'ID applicazione del client dalle appid
e dalle iss
attestazioni. Confronta quindi l'applicazione con un elenco di controllo di accesso (ACL) gestito. La granularità e il metodo dell'ACL possono variare notevolmente tra le risorse.
Un caso d'uso comune consiste nell'usare un elenco di controllo di accesso per eseguire test per un'applicazione Web o per un'API Web. L'API Web potrebbe concedere solo un subset di autorizzazioni complete a un client specifico. Per eseguire test end-to-end sull'API, è possibile creare un client di test che acquisisce token da Microsoft Identity Platform e quindi li invia all'API. L'API controlla quindi l'ACL per l'ID applicazione del client di test per l'accesso completo all'intera funzionalità dell'API. Se usi questo tipo di ACL, è importante convalidare non solo il valore del appid
chiamante, ma anche assicurarsi che il valore del token iss
sia attendibile.
Questo tipo di autorizzazione è comune per i daemon e gli account di servizio che devono accedere ai dati di proprietà degli utenti consumer che dispongono di account Microsoft personali. Per i dati di proprietà delle organizzazioni, è consigliabile ottenere l'autorizzazione necessaria tramite le autorizzazioni dell'applicazione.
Controllo dei token senza l'attestazione roles
Per abilitare questo modello di autorizzazione basato su ACL, Microsoft Entra ID non richiede che le applicazioni siano autorizzate a ottenere token per un'altra applicazione. Di conseguenza, i token esclusivi per app possono essere emessi senza un'attestazione roles
. Le applicazioni che espongono le API devono implementare i controlli delle autorizzazioni per accettare i token.
Se vuoi impedire alle applicazioni di ottenere token di accesso esclusivamente app senza ruolo per la tua applicazione, assicurati che i requisiti di assegnazione siano abilitati per l'app. In questo modo gli utenti e le applicazioni senza ruoli assegnati non potranno ottenere un token per questa applicazione.
Autorizzazioni dell’applicazione
Anziché usare elenchi di controllo di accesso, è possibile usare le API per esporre un set di autorizzazioni dell'applicazione. Questi vengono concessi a un'applicazione dall'amministratore di un'organizzazione e possono essere usati solo per accedere ai dati di proprietà di tale organizzazione e dei relativi dipendenti. Ad esempio, Microsoft Graph espone diverse autorizzazioni dell'applicazione per eseguire le operazioni seguenti:
- Leggi la posta in tutte le cassette postali
- Leggere e scrivere posta in tutte le cassette postali
- Inviare messaggi di posta elettronica come qualsiasi utente
- Leggere i dati della directory
Per usare i ruoli dell'app (autorizzazioni dell'applicazione) con la propria API (anziché Microsoft Graph), è prima necessario esporre i ruoli dell'app nella registrazione dell'app dell'API nell'interfaccia di amministrazione di Microsoft Entra. Quindi, configurare i ruoli dell'app necessari selezionando tali autorizzazioni nella registrazione dell'applicazione client. Se non sono stati esposti ruoli delle app nella registrazione dell'app dell'API, non sarà possibile specificare le autorizzazioni dell'applicazione per tale API nella registrazione dell'app dell'applicazione client nel centro amministrativo di Microsoft Entra.
Quando si esegue l'autenticazione come applicazione (anziché con un utente), non è possibile usare le autorizzazioni delegate perché non esiste alcun utente per l'app per agire per conto dell'utente. È necessario usare le autorizzazioni dell'applicazione, note anche come ruoli dell'app, concesse da un amministratore o dal proprietario dell'API.
Per altre informazioni sulle autorizzazioni dell'applicazione, vedere Autorizzazioni e consenso.
Consigliato: fare accedere l'amministratore nella tua app per assegnare ruoli all'app
In genere, quando si compila un'applicazione che usa le autorizzazioni dell'applicazione, l'app richiede una pagina o una visualizzazione in cui l'amministratore approva le autorizzazioni dell'app. Questa pagina può far parte del flusso di accesso dell'app, parte delle impostazioni dell'app o di un flusso di connessione dedicato. Spesso è opportuno che l'app mostri questa visualizzazione di connessione solo dopo che un utente ha eseguito l'accesso con un account Microsoft aziendale o dell'istituto di istruzione.
Se si accede all'utente nell'app, è possibile identificare l'organizzazione a cui appartiene l'utente prima di chiedere all'utente di approvare le autorizzazioni dell'applicazione. Anche se non strettamente necessario, può essere utile per creare un'esperienza più intuitiva per gli utenti. Per autenticare l'utente, seguire le esercitazioni sui protocolli di Microsoft Identity Platform.
Richiedere le autorizzazioni da un amministratore della directory
Quando si è pronti per richiedere le autorizzazioni dall'amministratore dell'organizzazione, è possibile reindirizzare l'utente all'endpoint di consenso amministratore di Microsoft Identity Platform.
// Line breaks are for legibility only.
GET https://login.microsoftonline.com/{tenant}/adminconsent?
client_id=00001111-aaaa-2222-bbbb-3333cccc4444
&state=12345
&redirect_uri=http://localhost/myapp/permissions
Suggerimento pro: provare a incollare la richiesta seguente in un browser.
https://login.microsoftonline.com/common/adminconsent?client_id=00001111-aaaa-2222-bbbb-3333cccc4444&state=12345&redirect_uri=http://localhost/myapp/permissions
Parametro | Condizione | Descrizione |
---|---|---|
tenant |
Obbligatorio | Il tenant della directory da cui si desidera ottenere autorizzazione. Può essere in formato GUID o nome descrittivo. Se non si conosce il tenant a cui appartiene l'utente e si vuole consentire l'accesso con qualsiasi tenant, usare common . |
client_id |
Obbligatorio | L'ID applicazione (client) che la funzionalità Microsoft Entra admin center – Registrazioni app ha assegnato all'app. |
redirect_uri |
Obbligatorio | URI di reindirizzamento in cui si desidera che venga inviata la risposta per la gestione da parte dell'app. Deve corrispondere esattamente a uno degli URI di reindirizzamento registrati nel portale, ad eccezione del fatto che deve essere codificato con URL e può avere segmenti di percorso aggiuntivi. |
state |
Consigliato | Un valore incluso nella richiesta, che viene anche restituito nella risposta del token. Può essere una stringa di qualsiasi contenuto desiderato. Lo stato viene usato per codificare informazioni sullo stato dell'utente nell'app prima che si sia verificata la richiesta di autenticazione, ad esempio la pagina o la visualizzazione in cui si trovavano. |
A questo punto, Microsoft Entra ID impone che solo un amministratore tenant possa accedere per completare la richiesta. All'amministratore verrà chiesto di approvare tutte le autorizzazioni dirette dell'applicazione richieste per l'app nel portale di registrazione delle app.
Risposta con esito positivo
Se l'amministratore approva le autorizzazioni per l'applicazione, la risposta con esito positivo sarà simile alla seguente:
GET http://localhost/myapp/permissions?tenant=aaaabbbb-0000-cccc-1111-dddd2222eeee&state=state=12345&admin_consent=True
Parametro | Descrizione |
---|---|
tenant |
Cliente della directory che ha concesso all'applicazione le autorizzazioni richieste, in formato GUID. |
state |
Valore incluso nella richiesta restituita anche nella risposta del token. Può essere una stringa di qualsiasi contenuto desiderato. Lo stato viene usato per codificare informazioni sullo stato dell'utente nell'app prima che si sia verificata la richiesta di autenticazione, ad esempio la pagina o la visualizzazione in cui si trovavano. |
admin_consent |
Impostato su True. |
Risposta di errore
Se l'amministratore non approva le autorizzazioni per l'applicazione, la risposta non riuscita sarà simile alla seguente:
GET http://localhost/myapp/permissions?error=permission_denied&error_description=The+admin+canceled+the+request
Parametro | Descrizione |
---|---|
error |
Stringa di codice di errore che è possibile usare per classificare i tipi di errori e che è possibile usare per reagire agli errori. |
error_description |
Messaggio di errore specifico che consente di identificare la causa radice di un errore. |
Dopo aver ricevuto una risposta positiva dall'endpoint di provisioning dell'app, l'app ha ottenuto le autorizzazioni applicative dirette richieste. È ora possibile richiedere un token per la risorsa desiderata.
Ottenere un token
Dopo aver acquisito l'autorizzazione necessaria per l'applicazione, procedere con l'acquisizione di token di accesso per le API. Per ottenere un token usando la concessione delle credenziali client, inviare una richiesta POST a /token
Microsoft Identity Platform. Esistono alcuni casi diversi:
- Richiesta di token di accesso con un segreto condiviso
- Richiesta di token di accesso con un certificato
- Richiesta di token di accesso con credenziali federate
Primo caso: richiesta di token di accesso con un segreto condiviso
POST /{tenant}/oauth2/v2.0/token HTTP/1.1 //Line breaks for clarity
Host: login.microsoftonline.com:443
Content-Type: application/x-www-form-urlencoded
client_id=00001111-aaaa-2222-bbbb-3333cccc4444
&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&client_secret=qWgdYAmab0YSkuL1qKv5bPX
&grant_type=client_credentials
# Replace {tenant} with your tenant!
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'client_id=00001111-aaaa-2222-bbbb-3333cccc4444&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default&client_secret=A1bC2dE3f...&grant_type=client_credentials' 'https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token'
Parametro | Condizione | Descrizione |
---|---|---|
tenant |
Obbligatorio | Tenant della directory in cui l'applicazione prevede di operare, in formato GUID o nome di dominio. |
client_id |
Obbligatorio | ID dell'applicazione assegnato alla tua app. Queste informazioni sono disponibili nel portale in cui è stata registrata l'app. |
scope |
Obbligatorio | Il valore passato per il scope parametro in questa richiesta deve essere l'identificatore di risorsa (URI ID applicazione) della risorsa desiderata, con suffisso con .default . Tutti gli ambiti inclusi devono essere per una singola risorsa. L'inclusione degli ambiti per più risorse genererà un errore. Per l'esempio di Microsoft Graph, il valore è https://graph.microsoft.com/.default . Questo valore indica a Microsoft Identity Platform che di tutte le autorizzazioni dirette applicative che hai configurato per la tua app, l'endpoint deve rilasciare un token per quelle associate alla risorsa che intendi utilizzare. Per altre informazioni sull'ambito /.default , vedere la documentazione sul consenso. |
client_secret |
Obbligatorio | Il segreto client che hai generato per la tua app nel portale di registrazione dell'app. Il segreto client deve essere codificato con URL prima di essere inviato. È supportato anche il modello di Autenticazione di Base, che prevede la fornitura delle credenziali nell'intestazione di autorizzazione, secondo RFC 6749. |
grant_type |
Obbligatorio | Deve essere impostato su client_credentials . |
Secondo caso: richiesta di token di accesso con un certificato
POST /{tenant}/oauth2/v2.0/token HTTP/1.1 // Line breaks for clarity
Host: login.microsoftonline.com:443
Content-Type: application/x-www-form-urlencoded
scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&client_id=11112222-bbbb-3333-cccc-4444dddd5555
&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
&client_assertion=eyJhbGciOiJSUzI1NiIsIng1dCI6Imd4OHRHeXN5amNScUtqRlBuZDdSRnd2d1pJMCJ9.eyJ{a lot of characters here}M8U3bSUKKJDEg
&grant_type=client_credentials
Parametro | Condizione | Descrizione |
---|---|---|
tenant |
Obbligatorio | Tenant della directory in cui l'applicazione prevede di operare, in formato GUID o nome di dominio. |
client_id |
Obbligatorio | L'ID dell'applicazione (client) assegnato alla tua app. |
scope |
Obbligatorio | Il valore passato per il scope parametro in questa richiesta deve essere l'identificatore di risorsa (URI ID applicazione) della risorsa desiderata, con suffisso con .default . Tutti gli ambiti inclusi devono essere per una singola risorsa. L'inclusione degli ambiti per più risorse genererà un errore. Per l'esempio di Microsoft Graph, il valore è https://graph.microsoft.com/.default . Questo valore indica a Microsoft Identity Platform che di tutte le autorizzazioni dirette applicative che hai configurato per la tua app, l'endpoint deve rilasciare un token per quelle associate alla risorsa che intendi utilizzare. Per altre informazioni sull'ambito /.default , vedere la documentazione sul consenso. |
client_assertion_type |
Obbligatorio | Il valore deve essere impostato su urn:ietf:params:oauth:client-assertion-type:jwt-bearer . |
client_assertion |
Obbligatorio | Un'attestazione (un token Web JSON) di cui hai bisogno di creare e firmare con il certificato che hai registrato come le credenziali della tua applicazione. Scopri di più sulle credenziali basate su certificato per informazioni su come registrare il tuo certificato e sul formato dell'asserzione. |
grant_type |
Obbligatorio | Deve essere impostato su client_credentials . |
I parametri per la richiesta basata su certificato differiscono in un solo modo rispetto alla richiesta basata su segreto condiviso: il client_secret
parametro viene sostituito dai client_assertion_type
parametri e client_assertion
.
Terzo caso: richiesta di token di accesso con credenziali federate
POST /{tenant}/oauth2/v2.0/token HTTP/1.1 // Line breaks for clarity
Host: login.microsoftonline.com:443
Content-Type: application/x-www-form-urlencoded
scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&client_id=11112222-bbbb-3333-cccc-4444dddd5555
&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
&client_assertion=eyJhbGciOiJSUzI1NiIsIng1dCI6Imd4OHRHeXN5amNScUtqRlBuZDdSRnd2d1pJMCJ9.eyJ{a lot of characters here}M8U3bSUKKJDEg
&grant_type=client_credentials
Parametro | Condizione | Descrizione |
---|---|---|
client_assertion |
Obbligatorio | Asserzione (token Web JWT o JSON) ottenuta dall'applicazione da un altro provider di identità all'esterno di Microsoft Identity Platform, ad esempio Kubernetes. Le specifiche di questo token JWT devono essere registrate nell'applicazione come credenziale di identità federata. Leggere informazioni sulla federazione delle identità per i carichi di lavoro per apprendere come configurare e usare le asserzioni generate da altri provider di identità. |
Tutto nella richiesta è identico al flusso basato su certificati, con l'eccezione cruciale dell'origine dell'oggetto client_assertion
. In questo flusso, l'applicazione non crea l'asserzione JWT stessa. L'app usa invece un token JWT creato da un altro provider di identità. Questa operazione è denominata federazione delle identità dei carichi di lavoro, in cui l'identità delle app in un'altra piattaforma di identità viene usata per acquisire i token nella Microsoft Identity Platform. Questo è più adatto per scenari tra cloud, ad esempio l'hosting del calcolo all'esterno di Azure, ma l'accesso alle API protette da Microsoft Identity Platform. Per informazioni sul formato richiesto dei JWT creati da altri provider di identità, leggi il formato dell'asserzione.
Risposta con esito positivo
Una risposta con esito positivo da qualsiasi metodo è simile alla seguente:
{
"token_type": "Bearer",
"expires_in": 3599,
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik1uQ19WWmNBVGZNNXBP..."
}
Parametro | Descrizione |
---|---|
access_token |
Token di accesso richiesto. L'app può usare questo token per eseguire l'autenticazione alla risorsa protetta, ad esempio per un'API Web. |
token_type |
Indica il valore del tipo di token. L'unico tipo supportato da Microsoft Identity Platform è bearer . |
expires_in |
Periodo di tempo in cui un token di accesso è valido (in secondi). |
Avvertimento
Non tentare di convalidare o leggere i token per qualsiasi API di cui non si è proprietari, inclusi i token in questo esempio, nel codice. I token per i servizi Microsoft possono usare un formato speciale che non verrà convalidato come token JWT e potrebbe anche essere crittografato per gli utenti consumer (account Microsoft). Sebbene la lettura dei token sia uno strumento utile per il debug e l'apprendimento, è consigliabile non dipendere da questo per il codice o presupporre specifiche sui token che non sono per un'API che si controlla.
Risposta di errore
Una risposta di errore (400 Richiesta non valida) è simile alla seguente:
{
"error": "invalid_scope",
"error_description": "AADSTS70011: The provided value for the input parameter 'scope' is not valid. The scope https://foo.microsoft.com/.default is not valid.\r\nTrace ID: 0000aaaa-11bb-cccc-dd22-eeeeee333333\r\nCorrelation ID: aaaa0000-bb11-2222-33cc-444444dddddd\r\nTimestamp: 2016-01-09 02:02:12Z",
"error_codes": [
70011
],
"timestamp": "YYYY-MM-DD HH:MM:SSZ",
"trace_id": "0000aaaa-11bb-cccc-dd22-eeeeee333333",
"correlation_id": "aaaa0000-bb11-2222-33cc-444444dddddd"
}
Parametro | Descrizione |
---|---|
error |
Stringa di codice di errore che è possibile usare per classificare i tipi di errori che si verificano e per reagire agli errori. |
error_description |
Messaggio di errore specifico che potrebbe aiutare a identificare la causa radice di un errore di autenticazione. |
error_codes |
Elenco di codici di errore specifici di STS che potrebbero essere utili per la diagnostica. |
timestamp |
Data/ora in cui si è verificato l'errore. |
trace_id |
Identificatore univoco per la richiesta di assistenza per la diagnostica. |
correlation_id |
Identificatore univoco per la richiesta per facilitare la diagnostica tra i componenti. |
Usare un token
Dopo aver acquisito un token, usare il token per effettuare richieste alla risorsa. Quando il token scade, ripetere la richiesta all'endpoint /token
per acquisire un nuovo token di accesso.
GET /v1.0/users HTTP/1.1
Host: graph.microsoft.com:443
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbG...
Provare il comando seguente nel terminale, assicurandosi di sostituire il token con il proprio.
curl -X GET -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbG..." 'https://graph.microsoft.com/v1.0/users'
Esempi di codice e altre documentazione
Leggere la documentazione di panoramica delle credenziali client da Microsoft Authentication Library
Esempio | Piattaforma | Descrizione |
---|---|---|
active-directory-dotnetcore-daemon-v2 | .NET 6.0+ | Un'applicazione ASP.NET Core che visualizza gli utenti di un tenant che esegue query su Microsoft Graph usando l'identità dell'applicazione, anziché per conto di un utente. L'esempio illustra anche la variante che usa i certificati per l'autenticazione. |
active-directory-dotnet-daemon-v2 | ASP.NET MVC | Applicazione Web che sincronizza i dati da Microsoft Graph usando l'identità dell'applicazione, anziché per conto di un utente. |
ms-identity-javascript-nodejs-console | Console Node.js | Un'applicazione Node.js che visualizza gli utenti di un tenant eseguendo una query su Microsoft Graph usando l'identità dell'applicazione |