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.
Bent u vergeten beheerderstoestemming te geven? Dit is vereist voor daemon-apps!
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.
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. 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 (bijvoorbeeldcontoso.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.