.NET-daemontoepassingen kunnen een web-API aanroepen. .NET-daemon-apps kunnen ook verschillende vooraf goedgekeurde web-API's aanroepen.
Microsoft.Identity.Web abstraheert de complexiteit van MSAL.NET. Het biedt u API's op een hoger niveau die de interne functies van MSAL.NET voor u verwerken, zoals het verwerken van fouten met voorwaardelijke toegang, opslaan in cache.
Hier volgt de Program.cs van de daemon-app die een downstream-API aanroept:
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();
tokenAcquirerFactory.Services.AddDownstreamApi("MyApi",
tokenAcquirerFactory.Configuration.GetSection("MyWebApi"));
var sp = tokenAcquirerFactory.Build();
var api = sp.GetRequiredService<IDownstreamApi>();
var result = await api.GetForAppAsync<IEnumerable<TodoItem>>("MyApi");
Console.WriteLine($"result = {result?.Count()}");
Hier volgt de Program.cs van een daemon-app die Microsoft Graph aanroept:
var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
tokenAcquirerFactory.Services.AddMicrosoftGraph();
var serviceProvider = tokenAcquirerFactory.Build();
try
{
GraphServiceClient graphServiceClient = serviceProvider.GetRequiredService<GraphServiceClient>();
var users = await graphServiceClient.Users
.GetAsync(r => r.Options.WithAppOnly());
Console.WriteLine($"{users.Count} users");
Console.ReadKey();
}
catch (Exception ex) { Console.WriteLine("We could not retrieve the user's list: " + $"{ex}"); }
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// Set the appropriate header fields in the request header.
conn.setRequestProperty("Authorization", "Bearer " + accessToken);
conn.setRequestProperty("Accept", "application/json");
String response = HttpClientHelper.getResponseStringFromConn(conn);
int responseCode = conn.getResponseCode();
if(responseCode != HttpURLConnection.HTTP_OK) {
throw new IOException(response);
}
JSONObject responseObject = HttpClientHelper.processResponse(responseCode, response);
Als een HTTP-client zoals Axios wordt gebruikt, roep de API-eindpunt-URI dan aan met een toegangstoken als autorisatiebearer.
const axios = require('axios');
async function callApi(endpoint, accessToken) {
const options = {
headers: {
Authorization: `Bearer ${accessToken}`
}
};
console.log('request made to web API at: ' + new Date().toString());
try {
const response = await axios.default.get(endpoint, options);
return response.data;
} catch (error) {
console.log(error)
return error;
}
};
endpoint = "url to the API"
http_headers = {'Authorization': 'Bearer ' + result['access_token'],
'Accept': 'application/json',
'Content-Type': 'application/json'}
data = requests.get(endpoint, headers=http_headers, stream=False).json()
AuthenticationResult-eigenschappen in MSAL.NET
De methoden voor het verkrijgen van tokens retourneren AuthenticationResult
. Voor niet-synchrone methoden wordt Task<AuthenticationResult>
geretourneerd.
In MSAL.NET stelt AuthenticationResult
het volgende beschikbaar:
AccessToken
voor de web-API voor toegang tot bronnen. Deze parameter is een tekenreeks, meestal een met Base64 gecodeerde JWT. De client mag nooit in het toegangstoken kijken. De indeling blijft niet gegarandeerd stabiel en kan worden versleuteld voor de resource. Het schrijven van code die afhankelijk is van de inhoud van het toegangstoken op de client, is een van de grootste bronnen van fouten en onderbrekingen van clientlogica. Zie Toegangstokens voor meer informatie.
IdToken
voor de gebruiker. Deze parameter is een gecodeerde JWT. Zie ID-tokens voor meer informatie.
ExpiresOn
geeft de datum en tijd aan waarop het token verloopt.
TenantId
bevat de tenant waarin de gebruiker is gevonden. Voor gastgebruikers in Microsoft Entra B2B-scenario's is de tenant-id de gasttenant, niet de unieke tenant.
Wanneer de token voor een gebruiker wordt geleverd, bevat AuthenticationResult
ook informatie over deze gebruiker. Voor vertrouwelijke clientstromen waarbij tokens worden aangevraagd zonder gebruiker voor de toepassing, is deze gebruikersinformatie null.
- De
Scopes
waarvoor de token is uitgegeven.
- De unieke id voor de gebruiker.
IAccount
MSAL.NET definieert het begrip van een account via de IAccount
-interface. Deze belangrijke wijziging biedt de juiste semantiek. Dezelfde gebruiker kan verschillende accounts hebben, in verschillende Microsoft Entra-mappen. MSAL.NET biedt ook betere informatie in het geval van gastscenario's, omdat informatie over het homeaccount wordt verstrekt.
Het volgende diagram toont de structuur van de IAccount
-interface.
De klasse AccountId
identificeert een account in een specifieke tenant met de eigenschappen in de volgende tabel.
Eigenschappen |
Beschrijving |
TenantId |
Een tekenreeksweergave voor een GUID, wat de id is van de tenant waarin het account zich bevindt. |
ObjectId |
Een tekenreeksweergave voor een GUID, wat de id is van de gebruiker die het account in de tenant bezit. |
Identifier |
Unieke id voor het account. Identifier is de samenvoeging van ObjectId en TenantId gescheiden door een komma. Deze zijn niet met Base64 gecodeerd. |
De IAccount
-interface vertegenwoordigt informatie over één account. Dezelfde gebruiker kan aanwezig zijn in verschillende tenants. Dit betekent dat een gebruiker meerdere accounts kan hebben. De leden ervan worden weergegeven in de volgende tabel.
Eigenschappen |
Beschrijving |
Username |
Een tekenreeks die de weergavewaarde bevat in UPN-indeling (UserPrincipalName), bijvoorbeeld john.doe@contoso.com. Deze tekenreeks kan null zijn, in tegenstelling tot HomeAccountId en HomeAccountId.Identifier, die niet null zijn. Deze eigenschap vervangt de eigenschap DisplayableId van IUser eerdere versies van MSAL.NET. |
Environment |
Een tekenreeks die de id-provider voor dit account bevat, bijvoorbeeld login.microsoftonline.com . Deze eigenschap vervangt de eigenschap IdentityProvider van IUser , behalve dat IdentityProvider ook informatie over de tenant had, naast de cloudomgeving. Hier is de waarde alleen de host. |
HomeAccountId |
De account-id van het homeaccount voor de gebruiker. Deze eigenschap identificeert de gebruiker uniek in Microsoft Entra-tenants. |
Het token gebruiken om een beveiligde API aan te roepen
Nadat AuthenticationResult
is geretourneerd door MSAL in result
, voegt u deze toe aan de HTTP-autorisatieheader voordat u de aanroep uitvoert voor toegang tot de beveiligde web-API.
httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
// Call the web API.
HttpResponseMessage response = await _httpClient.GetAsync(apiUri);
...
Voor daemon-apps moeten de web-API's die u aanroept vooraf worden goedgekeurd. Er is geen incrementele toestemming bij daemontoepassingen. (Er is geen gebruikersinteractie.) De tenantbeheerder moet vooraf toestemming geven voor de toepassing en alle API-machtigingen. Als u meerdere API's wilt aanroepen, moet u voor elke resource een token verkrijgen, telkens wanneer u AcquireTokenForClient
aanroept. MSAL gebruikt de cache van het toepassingstoken om onnodige service-aanroepen te voorkomen.