Dela via


Hämta token för att anropa ett webb-API med hjälp av ett daemonprogram

När du har skapat ett konfidentiellt klientprogram kan du hämta en token för appen genom att anropa AcquireTokenForClient, skicka omfånget och eventuellt tvinga fram en uppdatering av token.

Omfattningar som ska begäras

Omfånget för att begära ett flöde för klientautentiseringsuppgifter är namnet på resursen följt av /.default. Den här notationen instruerar Microsoft Entra-ID:t att använda de behörigheter på programnivå som deklareras statiskt under programregistreringen. Dessa API-behörigheter måste också beviljas av en klientadministratör.

Här är ett exempel på hur du definierar omfången för webb-API:et som en del av konfigurationen i en appsettings.json fil. Det här exemplet är hämtat från daemonkodexemplet för .NET-konsolen på 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]" ]
    }
}

Azure AD-resurser (v1.0)

Omfånget som används för klientautentiseringsuppgifter bör alltid vara resurs-ID följt av /.default.

Viktigt!

När MSAL begär en åtkomsttoken för en resurs som accepterar en version 1.0-åtkomsttoken parsar Microsoft Entra-ID den önskade målgruppen från det begärda omfånget genom att ta allt före det senaste snedstrecket och använda det som resursidentifierare. Så om resursen, som Azure SQL Database (https://database.windows.net), förväntar sig en målgrupp som slutar med ett snedstreck (för Azure SQL Database, https://database.windows.net/), måste du begära ett omfång på https://database.windows.net//.default. (Observera det dubbla snedstrecket.) Se även MSAL.NET problem #747: Resource url's trailing slash is omitted, which caused sql auth failure.

AcquireTokenForClient API

Om du vill hämta en token för appen använder AcquireTokenForClient du eller dess motsvarighet, beroende på plattformen.

Med Microsoft.Identity.Web behöver du inte hämta en token. Du kan använda API:er på högre nivå, som du ser i Anropa ett webb-API från ett daemonprogram. Om du däremot använder ett SDK som kräver en token visar följande kodfragment hur du hämtar den här 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;

Protokoll

Om du ännu inte har något bibliotek för det valda språket kanske du vill använda protokollet direkt:

Första fallet: Få åtkomst till tokenbegäran med hjälp av en delad hemlighet

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

Andra fallet: Få åtkomst till tokenbegäran med hjälp av ett certifikat

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

Mer information finns i protokolldokumentationen: Microsofts identitetsplattform och OAuth 2.0-klientens autentiseringsuppgifter.

Felsökning

Använde du omfånget resource/.default?

Om du får ett felmeddelande om att du har använt ett ogiltigt omfång har du förmodligen inte använt omfånget resource/.default .

Om du får otillräcklig behörighet för att slutföra åtgärdsfelet när du anropar API:et måste klientadministratören bevilja behörigheter till programmet.

Om du inte beviljar administratörsmedgivande till ditt program får du följande fel:

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>"
    }
  }
}

Välj något av följande alternativ, beroende på roll.

Molnappadministratör

Som molnprogramadministratör går du till Företagsprogram i administrationscentret för Microsoft Entra. Välj appregistreringen och välj Behörigheter i avsnittet Säkerhet i den vänstra rutan. Välj sedan den stora knappen med etiketten Bevilja administratörsmedgivande för {Klientnamn} (där {Klientnamn} är namnet på katalogen).

Standardanvändare

För en standardanvändare av din klientorganisation ber du en molnprogramadministratör att bevilja administratörsmedgivande till programmet. Det gör du genom att ange följande URL till administratören:

https://login.microsoftonline.com/Enter_the_Tenant_Id_Here/adminconsent?client_id=Enter_the_Application_Id_Here

I URL:en:

  • Ersätt Enter_the_Tenant_Id_Here med klient-ID:t eller klientorganisationens namn (till exempel contoso.microsoft.com).
  • Enter_the_Application_Id_Here är programmets (klientens) ID för det registrerade programmet.

Felet AADSTS50011: No reply address is registered for the application kan visas när du har beviljat medgivande till appen med hjälp av föregående URL. Det här felet beror på att programmet och URL:en inte har någon omdirigerings-URI. Detta kan ignoreras.

Anropar du ditt eget API?

Om din daemonapp anropar ditt eget webb-API och du inte kunde lägga till en appbehörighet till daemonens appregistrering måste du lägga till approller i webb-API:ets appregistrering.

Nästa steg

Gå vidare till nästa artikel i det här scenariot, Anropa ett webb-API.