Tokens verkrijgen om een web-API aan te roepen met behulp van een daemon-toepassing

Van toepassing op: Groene cirkel met een wit vinkje dat aangeeft dat de volgende inhoud van toepassing is op werknemerstenants. Werknemerstenants (meer informatie)

Een token verkrijgen voor een vertrouwelijke clienttoepassing

Daemon-toepassingen en andere vertrouwelijke client-apps die worden uitgevoerd zonder gebruikersinteractie, gebruiken de OAuth 2.0-clientreferentiestroom om alleen-app-toegangstokens te verkrijgen. In dit artikel wordt uitgelegd hoe u de vereiste bereiken configureert, de AcquireTokenForClient API (of het bijbehorende platformequivalent) aanroept om een token te verkrijgen en veelvoorkomende fouten op te lossen. Voordat u verdergaat, controleert u of u al een vertrouwelijke clienttoepassing hebt gemaakt.

Bereiken die moeten worden aangevraagd

Het bereik dat moet worden aangevraagd voor een client credentials flow is de naam van de resource gevolgd door /.default. De /.default notatie vertelt Microsoft Entra ID om de machtigingen op toepassingsniveau statisch te gebruiken die tijdens de registratie van de toepassing zijn gedeclareerd. Deze API-machtigingen moeten daarnaast worden verleend door een tenantbeheerder.

Hier is een voorbeeld van het definiëren van de scopes voor de web-API als onderdeel van de configuratie in een appsettings.json-bestand. Dit voorbeeld is afkomstig uit het codevoorbeeld van de .NET-console-daemon op 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 (v1.0)-resources

Het bereik dat wordt gebruikt voor client credentials moet altijd de resource ID zijn, gevolgd door /.default.

Belangrijk

Wanneer MSAL een toegangstoken aanvraagt voor een resource die een toegangstoken van versie 1.0 accepteert, parseert Microsoft Entra-id de gewenste doelgroep uit het aangevraagde bereik door alles vóór de laatste slash te nemen en te gebruiken als de resource-id. Dus als de resource, zoals Azure SQL Database (https://database.windows.net), een doelgroep verwacht die eindigt op een slash (voor Azure SQL Database), https://database.windows.net/moet u een bereik van https://database.windows.net//.default. (Let op de dubbele slash.) Zie ook MSAL.NET-probleem #747: Resource url's trailing slash is omitted, which caused sql auth failure.

AcquireTokenForClient-API

Als u een token voor de app wilt verkrijgen, gebruikt AcquireTokenForClient of het equivalent ervan, afhankelijk van het platform.

Met Microsoft. Identity.Web, u hoeft geen token rechtstreeks te verkrijgen. U kunt API's op een hoger niveau gebruiken, zoals u ziet in het aanroepen van een web-API vanuit een daemon-toepassing. Als u echter een SDK gebruikt waarvoor een token is vereist, kunt u een app-token verkrijgen via de ITokenAcquirer abstractie, zoals wordt weergegeven in het volgende voorbeeld:

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;

protocol

Als u nog geen bibliotheek voor de gekozen taal hebt, wilt u het protocol mogelijk rechtstreeks gebruiken:

Eerste geval: toegang tot de tokenaanvraag met behulp van een gedeeld geheim

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

Tweede geval: toegang tot de tokenaanvraag met behulp van een certificaat

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

Zie de protocoldocumentatie: Microsoft Identity Platform en de OAuth 2.0-clientreferentiestroom voor meer informatie.

Probleemoplossing

Hebt u de resource/.default scope gebruikt?

Als u een foutbericht krijgt waarin wordt aangegeven dat u een ongeldig bereik hebt gebruikt, hebt u waarschijnlijk niet het bereik resource/.default gebruikt.

Als u de fout Onvoldoende bevoegdheden om de bewerking te voltooien krijgt, wanneer u de API aanroept, moet de tenantbeheerder machtigingen verlenen aan de toepassing.

Als u geen beheerderstoestemming voor uw toepassing verleent, retourneert de API een foutbericht dat vergelijkbaar is met het volgende voorbeeld:

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

Selecteer een van de volgende opties, afhankelijk van de rol.

Beheerder van de cloudtoepassing

Voor een cloudtoepassingsbeheerder gaat u naar Bedrijfstoepassingen in het Microsoft Entra-beheercentrum. Selecteer de app-registratie en selecteer Machtigingen in de sectie Beveiliging van het linkerdeelvenster. Selecteer vervolgens de grote knop met het label Beheerderstoestemming verlenen voor {Tenant Name} (waarbij {Tenant Name} de naam van de map is).

Standaardgebruiker

Voor een standaardgebruiker van uw tenant vraagt u een cloudtoepassingsbeheerder om beheerderstoestemming te verlenen aan de toepassing. Als u toestemming wilt aanvragen, stuurt u de beheerder naar de volgende EINDPUNT-URL voor beheerderstoestemming:

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

In de URL:

  • Vervang Enter_the_Tenant_Id_Here door de tenant-id of tenantnaam (bijvoorbeeld contoso.microsoft.com).
  • Enter_the_Application_Id_Here is de toepassings-id (client) voor de geregistreerde toepassing.

De fout AADSTS50011: No reply address is registered for the application kan worden weergegeven nadat u toestemming voor de app hebt verleend met behulp van de voorgaande URL. De AADSTS50011 fout treedt op omdat de toepassing en de URL geen omleidings-URI hebben. U kunt deze fout veilig negeren.

Roept u uw eigen API aan?

Als uw daemon-app uw eigen web-API aanroept en u geen app-machtiging hebt toegevoegd aan de app-registratie van de daemon, moet u App-rollen toevoegen aan de app-registratie van de web-API.

Volgende stappen

Ga verder met het volgende artikel in dit scenario: Een web-API aanroepen.