Daemon-App, die Web-APIs aufruft – Aufruf eines Tokens

Nachdem die vertrauliche Clientanwendung erstellt wurde, können Sie ein Token für die App abrufen, indem Sie AcquireTokenForClient aufrufen, den Bereich übergeben und ggf. die Aktualisierung des Tokens erzwingen.

Anzufordernde Bereiche

Der anzufordernde Bereich für einen Anmeldeinformationsfluss für Clients ist der Name der Ressource, gefolgt von /.default. Durch diese Notation weiß Microsoft Entra ID, dass die Berechtigungen auf Anwendungsebene verwendet werden sollen, die im Zuge der Anwendungsregistrierung statisch deklariert wurden. Außerdem müssen diese API-Berechtigungen von einem Mandantenadministrator gewährt werden.

Hier sehen Sie ein Beispiel für die Definition der Bereiche für die Web-API als Teil der Konfiguration in einer Datei vom Typ appsettings.json. Dieses Beispiel stammt aus dem Codebeispiel .NET-Konsolen-Daemon auf 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-Ressourcen (v1.0)

Der für die Clientanmeldeinformationen verwendete Bereich muss immer die Ressourcen-ID gefolgt von /.default sein.

Wichtig

Wenn MSAL ein Zugriffstoken für eine Ressource anfordert, die ein Zugriffstoken der Version 1.0 akzeptiert, analysiert Microsoft Entra ID die gewünschte Zielgruppe aus dem angeforderten Bereich, indem alles vor dem letzten Schrägstrich als Ressourcenbezeichner verwendet wird. Wenn also, wie bei Azure SQL Database (https://database.windows.net), die Ressource eine Zielgruppe erwartet, die mit einem Schrägstrich endet (für Azure SQL Database, https://database.windows.net/), müssen Sie einen Bereich von https://database.windows.net//.default anfordern. (Beachten Sie den doppelten Schrägstrich.) Siehe auch MSAL.NET Ausgabe #747: Resource url's trailing slash is omitted, which caused sql auth failure.

AcquireTokenForClient-API

Verwenden Sie zum Abrufen eines Tokens für die App AcquireTokenForClient oder die Entsprechung für die jeweilige Plattform.

Bei Microsoft.Identity.Web müssen Sie kein Token abrufen. Sie können APIs höherer Ebene verwenden, wie unter Daemon-App, die Web-APIs aufruft – Aufrufen einer Web-API aus der App erläutert. Wenn Sie jedoch ein SDK verwenden, das ein Token erfordert, zeigt der folgende Codeschnipsel, wie Sie dieses Token abrufen.

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

Wenn Sie noch nicht über eine Bibliothek für die Programmiersprache Ihrer Wahl verfügen, können Sie das Protokoll auch direkt verwenden:

Erster Fall: Zugreifen auf die Tokenanforderung mit einem freigegebenen Geheimnis

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=535fb089-9ff3-47b6-9bfb-4f1264799865
&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&client_secret=qWgdYAmab0YSkuL1qKv5bPX
&grant_type=client_credentials

Zweiter Fall: Zugreifen auf die Tokenanforderung mit einem Zertifikat

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=97e0a5b7-d745-40b6-94fe-5f77d35c6e05
&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

Weitere Informationen finden Sie in der Protokolldokumentation: Microsoft Identity Platform und der Fluss von OAuth 2.0-Clientanmeldeinformationen.

Problembehandlung

Haben Sie den Bereich „resource/.default“ verwendet?

Wenn Ihnen eine Fehlermeldung angezeigt wird, nach der Sie einen ungültigen Bereich verwendet haben, haben Sie wahrscheinlich nicht den Bereich resource/.default verwendet.

Wenn Ihnen beim Aufruf der API die Fehlermeldung Nicht genügend Berechtigungen zum Abschließen des Vorgangs angezeigt wird, muss der Mandantenadministrator der Anwendung Berechtigungen gewähren. Eine Anleitung zum Erteilen der Administratoreinwilligung für Ihre Anwendung finden Sie unter Schnellstart: Abrufen eines Tokens und Aufrufen von Microsoft Graph in einer .NET-Konsolen-App in Schritt 4.

Wenn Sie Ihrer Anwendung keine Administratoreinwilligung erteilen, tritt der folgende Fehler auf:

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

Rufen Sie Ihre eigene API auf?

Wenn Ihre Daemon-App eine eigene Web-API aufruft und Sie keine App-Berechtigung zur App-Registrierung des Daemons hinzufügen konnten, müssen Sie App-Rollen zur App-Registrierung der Web-API hinzufügen.

Nächste Schritte

Fahren Sie mit dem nächsten Artikel in diesem Szenario fort: Aufrufen einer Web-API.