Les applications démon .NET peuvent appeler une API web. Des applications démon .NET peuvent également appeler plusieurs API web pré-approuvées.
Microsoft.Identity.Web fait abstraction de la complexité des MSAL.NET. Il vous fournit des API de niveau supérieur qui gèrent les éléments internes de MSAL.NET pour vous, comme le traitement des erreurs d’accès conditionnel et la mise en cache.
Voici le fichier Program.cs de l’application démon appelant une API en aval :
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()}");
Voici le fichier Program.cs d’une application démon qui appelle Microsoft Graph :
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);
À l’aide d’un client HTTP comme Axios, appelez l’URI du point de terminaison de l’API avec un jeton d’accès en tant que porteur des autorisations.
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()
Propriétés AuthenticationResult dans MSAL.NET
Les méthodes d'acquisition de jetons renvoient AuthenticationResult
. Pour les méthodes asynchrones, Task<AuthenticationResult>
retourne.
Dans MSAL.NET, AuthenticationResult
expose :
AccessToken
pour que l’API web accède aux ressources. Ce paramètre correspond à une chaîne, généralement un JWT encodé en base 64. Le client ne doit jamais regarder dans le jeton d’accès. La stabilité du format n’est pas garantie et ce dernier peut être chiffré pour la ressource. L’écriture de code qui dépend du contenu des jetons d’accès sur le client constitue l’une des sources d’erreurs et des ruptures de logique client les plus importantes. Pour plus d’informations, consultez Jetons d'accès.
IdToken
pour l'utilisateur. Ce paramètre est un jeton JWT encodé. Pour plus d'informations, consultez Jetons d’ID.
ExpiresOn
exprime la date et l'heure d’expiration du jeton.
TenantId
contient le locataire dans lequel l’utilisateur a été trouvé. Pour les utilisateurs invités dans les scénarios Microsoft Entra B2B, l’ID de tenant est le tenant invité et non le tenant unique.
Lorsque le jeton est remis pour un utilisateur, AuthenticationResult
contient également les informations sur cet utilisateur. Pour les flux de clients confidentiels où les jetons sont demandés sans aucun utilisateur pour l’application, ces informations sur l’utilisateur sont manquantes ou inconnues.
- Les
Scopes
pour lesquelles le jeton a été émis.
- L’ID unique de l’utilisateur.
IAccount
MSAL.NET définit la notion de compte via l’interface IAccount
. Ce changement cassant fournit la sémantique qui convient. Un même utilisateur peut disposer de plusieurs comptes, dans des répertoires Microsoft Entra différents. De plus, MSAL.NET fournit de meilleures informations dans les scénarios d’invité, car des informations de compte d’accueil sont fournies.
Le schéma suivant présente la structure de l’interface IAccount
.
La classe AccountId
identifie un compte dans un locataire spécifique avec les propriétés indiquées dans le tableau suivant.
Propriété |
Description |
TenantId |
Une représentation de chaîne pour un identificateur global unique, qui correspond à l’ID du locataire où réside le compte. |
ObjectId |
Une représentation de chaîne pour un identificateur global unique, qui correspond à l’ID de l’utilisateur qui possède le compte dans le locataire. |
Identifier |
Identificateur unique pour ce compte. Identifier est la concaténation de ObjectId et de TenantId séparés par une virgule. Ils ne sont pas encodés base64. |
L’interface IAccount
représente les informations d’un seul compte. Le même utilisateur peut être présent dans différents locataires, ce qui signifie qu'un utilisateur peut disposer de plusieurs comptes. Ses membres sont disponibles dans le tableau suivant.
Propriété |
Description |
Username |
Une chaîne contenant la valeur affichée au format UserPrincipalName (UPN), par exemple, john.doe@contoso.com. Cette chaîne peut être Null, alors que HomeAccountId et HomeAccountId.Identifier ne le sont pas. Cette propriété remplace la propriété DisplayableId de IUser dans les versions précédentes de MSAL.NET. |
Environment |
Une chaine contenant le fournisseur d’identité de ce compte, par exemple, login.microsoftonline.com . Cette propriété remplace la propriété IdentityProvider de IUser , sauf que IdentityProvider disposait aussi des informations sur le locataire (en plus de l’environnement cloud). Ici, la valeur n’est que l’hôte. |
HomeAccountId |
L'ID du compte d’accueil de l’utilisateur. Cette propriété identifie de façon unique l’utilisateur entre les tenants Microsoft Entra. |
Utiliser le jeton pour appeler une API protégée
Après renvoi de AuthenticationResult
par MSAL dans result
, ajoutez-le à l’en-tête d’autorisation HTTP avant de passer l’appel pour accéder à l’API web protégée.
httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
// Call the web API.
HttpResponseMessage response = await _httpClient.GetAsync(apiUri);
...
Pour des applications de démon, les API web que vous appelez doivent être pré-approuvées. Il n'y a pas de consentement incrémentiel avec les applications démon. (Il n'y a aucune interaction avec l'utilisateur.) L'administrateur client doit donner son consentement à l'avance pour l'application et toutes les autorisations d'API. Si vous souhaitez appeler plusieurs API, acquérez un jeton pour chaque ressource, en appelant AcquireTokenForClient
à chaque fois. MSAL utilise le cache de jetons d’application afin d’éviter des appels de service inutiles.