Acquisire i token per chiamare un'API Web con un'applicazione daemon
Dopo aver creato un'applicazione client riservata, è possibile acquisire un token per l'app chiamando AcquireTokenForClient
, passando l'ambito e, facoltativamente, forzando un aggiornamento del token.
Ambiti da richiedere
L'ambito da richiedere per un flusso di credenziali client è il nome della risorsa seguito da /.default
. Questa notazione indica a Microsoft Entra ID di usare le autorizzazioni a livello di applicazione dichiarate in modo statico durante la registrazione dell'applicazione. Inoltre, queste autorizzazioni API devono essere concesse da un amministratore tenant.
Ecco un esempio degli ambiti per l'API Web definiti nell’ambito della configurazione in un file appsettings.json. Questo esempio è tratto dall'esempio di codice del daemon della console .NET in GitHub.
{
"AzureAd": {
// Same AzureAd section as before.
},
"MyWebApi": {
"BaseUrl": "https://localhost:44372/",
"RelativePath": "api/TodoList",
"RequestAppToken": true,
"Scopes": [ "[Enter here the scopes for your web API]" ]
}
}
Risorse di Azure AD (v1.0)
L'ambito usato per le credenziali client deve essere sempre l'ID risorsa seguito da /.default
.
Importante
Quando MSAL richiede un token di accesso per una risorsa che accetta un token di accesso versione 1.0, Microsoft Entra ID analizza i destinatari desiderati dall'ambito richiesto prendendo tutto prima dell'ultima barra e usandolo come identificatore di risorsa.
Se, come nel caso del database SQL di Azure (https://database.windows.net
), la risorsa prevede destinatari che terminano con una barra (per il database SQL di Azure, https://database.windows.net/
), sarà necessario richiedere un ambito di https://database.windows.net//.default
. Si noti la doppia barra. Vedere anche l’articolo 747: Resource url's trailing slash is omitted, which caused sql auth failure
di MSAL.NET.
API AcquireTokenForClient
Per acquisire un token per l'app, usare AcquireTokenForClient
o il relativo equivalente, a seconda della piattaforma.
Con Microsoft.Identity.Web non è necessario acquisire un token. È possibile usare API di livello superiore, come illustrato in Chiamare un'API Web da un'applicazione daemon. Se tuttavia si usa un SDK che richiede un token, il frammento di codice seguente mostra come ottenere questo token.
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Identity.Abstractions;
using Microsoft.Identity.Web;
// In the Program.cs, acquire a token for your downstream API
var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
ITokenAcquirer acquirer = tokenAcquirerFactory.GetTokenAcquirer();
AcquireTokenResult tokenResult = await acquirer.GetTokenForUserAsync(new[] { "https://graph.microsoft.com/.default" });
string accessToken = tokenResult.AccessToken;
Protocollo
Se non si dispone ancora di una libreria per la lingua scelta, è possibile usare direttamente il protocollo:
Primo caso: accedere alla richiesta di token con un segreto condiviso
POST /{tenant}/oauth2/v2.0/token HTTP/1.1 //Line breaks for clarity.
Host: login.microsoftonline.com
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=A1b-C2d_E3f.H4i,J5k?L6m!N7o-P8q_R9s.T0u
&grant_type=client_credentials
Secondo caso: accedere alla richiesta di token con un certificato
POST /{tenant}/oauth2/v2.0/token HTTP/1.1 // Line breaks for clarity.
Host: login.microsoftonline.com
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=aaaaaaaa-0b0b-...
&grant_type=client_credentials
Per altre informazioni, vedere la documentazione del protocollo: Microsoft Identity Platform e il flusso di credenziali client OAuth 2.0.
Risoluzione dei problemi
È stato usato l'ambito resource/.default?
Se viene visualizzato un messaggio di errore che indica che è stato usato un ambito non valido, probabilmente non è stato usato l'ambito resource/.default
.
Si è dimenticato di fornire il consenso dell'amministratore? Le app daemon ne hanno bisogno.
Se viene restituito l’errore Privilegi insufficienti per completare l'operazione quando si chiama l'API , l'amministratore tenant deve concedere le autorizzazioni all'applicazione.
Se non si concede il consenso amministratore all'applicazione, si verifica l'errore seguente:
Failed to call the web API: Forbidden
Content: {
"error": {
"code": "Authorization_RequestDenied",
"message": "Insufficient privileges to complete the operation.",
"innerError": {
"request-id": "<guid>",
"date": "<date>"
}
}
}
Selezionare una delle opzioni seguenti, a seconda del ruolo.
Amministratore di applicazioni cloud
Per un amministratore di applicazioni cloud, passare ad Applicazioni aziendali nell'interfaccia di amministrazione di Microsoft Entra. Selezionare la registrazione dell'app e selezionare Autorizzazioni nella sezione Sicurezza del riquadro sinistro. Selezionare il pulsante grande Concedi consenso amministratore per {nome tenant}, dove {nome tenant} è il nome della directory.
Utente standard
Per un utente standard del tenant, chiedere a un amministratore di applicazioni cloud di concedere il consenso amministratore all'applicazione. A tale scopo, fornire l'URL seguente all'amministratore:
https://login.microsoftonline.com/Enter_the_Tenant_Id_Here/adminconsent?client_id=Enter_the_Application_Id_Here
Nell'URL:
- Sostituire
Enter_the_Tenant_Id_Here
con l'ID tenant o il nome del tenant, ad esempiocontoso.microsoft.com
. Enter_the_Application_Id_Here
è l'ID applicazione (client) per l'applicazione registrata.
È possibile che venga visualizzato l'errore AADSTS50011: No reply address is registered for the application
dopo aver concesso il consenso all'app usando l'URL precedente. Questo errore si verifica perché l'applicazione e l'URL non hanno un URI di reindirizzamento. Questo messaggio può essere ignorato.
Viene chiamata la propria API?
Se l'app daemon chiama la propria API Web e non è possibile aggiungere un'autorizzazione per l'app alla registrazione dell'app del daemon, è necessario aggiungere i ruoli dell'app alla registrazione dell'app dell'API Web.
Passaggi successivi
Passare all'articolo successivo in questo scenario: Chiamare un'API Web.