Daemon-app die web-Api's aanroept-een Token ophalen

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

Te aanvragen scopes

Het bereik dat moet worden aangevraagd voor een client referentie stroom is de naam van de resource gevolgd door /.default . Deze notatie vertelt Azure Active Directory (Azure AD) voor het gebruik van de machtigingen op toepassings niveau die statisch zijn gedeclareerd tijdens de registratie van de toepassing. Daarnaast moeten deze API-machtigingen worden verleend door een Tenant beheerder.

ResourceId = "someAppIDURI";
var scopes = new [] {  ResourceId+"/.default"};

Azure AD (v 1.0)-resources

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

Belangrijk

Wanneer MSAL een toegangs token aanvraagt voor een resource die een versie 1,0-toegangs token accepteert, parseert Azure AD de gewenste doel groep uit het aangevraagde bereik door alles vóór de laatste slash te nemen en deze als resource-id te gebruiken. Als, als Azure SQL Database (https: / /database.Windows.net), de resource verwacht dat een doel groep eindigt met een slash (voor Azure SQL database https://database.windows.net/ ), moet u een bereik van aanvragen https://database.windows.net//.default . (Let op de dubbele slash.) Zie ook MSAL.NET issue #747: de afsluitende slash van de resource-URL wordt wegge laten, wat een SQL-verificatie fout heeft veroorzaakt.

AcquireTokenForClient-API

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

using Microsoft.Identity.Client;

// With client credentials flows, the scope is always of the shape "resource/.default" because the
// application permissions need to be set statically (in the portal or by PowerShell), and then granted by
// a tenant administrator.
string[] scopes = new string[] { "https://graph.microsoft.com/.default" };

AuthenticationResult result = null;
try
{
 result = await app.AcquireTokenForClient(scopes)
                  .ExecuteAsync();
}
catch (MsalUiRequiredException ex)
{
    // The application doesn't have sufficient permissions.
    // - Did you declare enough app permissions during app creation?
    // - Did the tenant admin grant permissions to the application?
}
catch (MsalServiceException ex) when (ex.Message.Contains("AADSTS70011"))
{
    // Invalid scope. The scope has to be in the form "https://resourceurl/.default"
    // Mitigation: Change the scope to be as expected.
}

AcquireTokenForClient maakt gebruik van de toepassings token cache

In MSAL.NET AcquireTokenForClient wordt de toepassings token cache gebruikt. (Alle andere AcquireToken xx -methoden gebruiken de token cache van de gebruiker.) Roep niet AcquireTokenSilent aan voordat u belt AcquireTokenForClient , omdat AcquireTokenSilent de cache van de gebruikers token wordt gebruikt. AcquireTokenForClient Hiermee wordt de cache van het toepassings token zelf gecontroleerd en bijgewerkt.

Protocol

Als u nog geen bibliotheek hebt voor de taal die u hebt gekozen, kunt u het protocol het beste rechtstreeks gebruiken:

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

Tweede geval: toegang tot de token aanvraag 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=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

Zie de documentatie over het micro soft-identiteits platform en de OAuth 2,0-client referenties stroomvoor meer informatie.

Problemen oplossen

Hebt u het resource/.-standaard bereik gebruikt?

Als er een fout bericht wordt weer gegeven met de melding dat u een ongeldig bereik hebt gebruikt, hebt u waarschijnlijk geen gebruik gemaakt van het resource/.default bereik.

Als u een ontoereikende bevoegdheid krijgt om de bewerkings fout te volt ooien wanneer u de API aanroept, moet de Tenant beheerder machtigingen verlenen voor de toepassing. Zie stap 6 van de bovenstaande client-app registreren. Normaal gesp roken ziet u een fout die er als volgt uitziet:

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

Roept u uw eigen API aan?

Als u uw eigen web-API aanroept en geen app-machtiging kunt toevoegen aan de app-registratie voor uw daemon-app, hebt u een app-rol beschikbaar in uw web-API?

Zie voor meer informatie toepassings machtigingen (app-rollen) weer geven en, in het bijzonder, ervoor te zorgen dat Azure AD tokens voor uw web-API alleen aan toegestane clients geeft.

Volgende stappen

Ga naar het volgende artikel in dit scenario om een web-APIaan te roepen.