Abrufen von Token zum Aufrufen einer Web-API mithilfe einer Daemonanwendung
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=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
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=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
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.
Haben Sie die Administratoreinwilligung vergessen? Diese wird von Daemon-Apps benötigt!
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.
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>"
}
}
}
Wählen Sie je nach Rolle eine der folgenden Optionen aus.
Cloudanwendungsadministrator
Navigieren Sie mit der Rolle „Cloudanwendungsadministrator“ im Microsoft Entra Admin Center zu Unternehmensanwendungen. Wählen Sie die App-Registrierung und dann im linken Bereich im Abschnitt Sicherheit die Option Berechtigungen aus. Wählen Sie anschließend die große Schaltfläche mit der Bezeichnung Administratoreinwilligung für {Mandantenname} erteilen aus. (Dabei ist {Mandantenname} der Name des Verzeichnisses.)
Standardbenutzer
Wenn Sie ein Standardbenutzerkonto in Ihrem Mandanten haben, müssen Sie eine Person mit der Rolle „Cloudanwendungsadministrator“ um die Erteilung der Administratoreinwilligung für die Anwendung bitten. Übermitteln Sie hierzu die folgende URL an den Administrator:
https://login.microsoftonline.com/Enter_the_Tenant_Id_Here/adminconsent?client_id=Enter_the_Application_Id_Here
In der URL gilt Folgendes:
- Ersetzen Sie
Enter_the_Tenant_Id_Here
durch die Mandanten-ID oder den Mandanten Namen (z. B.contoso.microsoft.com
). Enter_the_Application_Id_Here
ist die Anwendungs-ID (Client-ID) für die registrierte Anwendung.
Möglicherweise wird der Fehler AADSTS50011: No reply address is registered for the application
angezeigt, nachdem Sie der App mithilfe der vorherigen URL Ihre Zustimmung erteilt haben. Dieser Fehler tritt auf, weil die Anwendung und die URL keinen Umleitungs-URI haben. Sie können diese Warnmeldung ignorieren.
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.