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

Nadat u een vertrouwelijke clienttoepassing hebt gemaakt, kunt u een token voor de app verkrijgen door AcquireTokenForClient aan te roepen, het bereik door te geven, en eventueel een vernieuwing van het token af te dwingen.

Bereiken die moeten worden aangevraagd

Het bereik dat moet worden aangevraagd voor een clientreferentiestroom is de naam van de resource gevolgd door /.default. Deze notatie vertelt Microsoft Entra-id dat de machtigingen op toepassingsniveau statisch moeten worden gebruikt die tijdens de registratie van de toepassing zijn gedeclareerd. Deze API-machtigingen moeten daarnaast worden verleend door een tenantbeheerder.

Hier volgt een voorbeeld van het definiëren van de bereiken 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 clientreferenties 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. Als dus bijvoorbeeld bij Azure SQL Database (https://database.windows.net) de resource 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 aanvragen. (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 hoeft u geen token 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, ziet u in het volgende codefragment hoe u dit token kunt ophalen.

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

Gebruikt u het bereik resource/.standaard?

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, treedt de volgende fout op:

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.

Globale tenantbeheerder

Ga voor een globale tenantbeheerder naar Enterprise-toepassingen 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 Globale Beheer istrator om beheerderstoestemming te verlenen aan de toepassing. Geef hiervoor de volgende URL op voor de beheerder:

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. Deze fout treedt op omdat de toepassing en de URL geen omleidings-URI hebben. U kunt deze waarschuwing 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.