Acquisire i token per chiamare un'API Web usando 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 seguita 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 di definizione degli ambiti per l'API Web come parte della configurazione in un file di 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 il gruppo di destinatari desiderato dall'ambito richiesto prendendo tutto prima dell'ultima barra e usandolo come identificatore di risorsa. Pertanto, se, come database SQL di Azure (https://database.windows.net), la risorsa prevede un gruppo di destinatari che termina con una barra (per database SQL di Azure, https://database.windows.net/), è necessario richiedere un ambito di https://database.windows.net//.default. Si noti la doppia barra. Vedere anche MSAL.NET problema 747: Resource url's trailing slash is omitted, which caused sql auth failure.

AcquireTokenForClient API

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 Chiamata di 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 usando 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 usando 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 .

Se si ottengono privilegi insufficienti per completare l'errore di 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 del tenant globale

Per un amministratore tenant globale, passare a Applicazioni aziendali nell'interfaccia di amministrazione di Microsoft Entra. Selezionare la registrazione dell'app e selezionare Autorizzazioni nella sezione Sicurezza del riquadro sinistro. Selezionare quindi il pulsante grande Concedi il consenso amministratore per {Nome tenant} (dove {Nome tenant} è il nome della directory).

Utente standard

Per un utente standard del tenant, chiedere a un Amministrazione istrator globale di concedere il consenso amministratore all'applicazione. A tale scopo, specificare 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 esempio contoso.microsoft.com.
  • Enter_the_Application_Id_Here è l'ID applicazione (client) per l'applicazione registrata.

L'errore AADSTS50011: No reply address is registered for the application può essere visualizzato 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.

Si chiama la propria API?

Se l'app daemon chiama la propria API Web e non è stata possibile aggiungere un'autorizzazione dell'app alla registrazione dell'app del daemon, è necessario aggiungere ruoli dell'app alla registrazione dell'app dell'API Web.

Passaggi successivi

Passare all'articolo successivo in questo scenario, Chiamata di un'API Web.