Le app daemon .NET possono chiamare un'API Web. Le app daemon .NET possono anche chiamare diverse API Web preapprovate.
Microsoft.Identity.Web astrae la complessità delle MSAL.NET. Offre API di livello superiore che gestiscono automaticamente gli elementi interni di MSAL.NET, ad esempio l'elaborazione di errori di accesso condizionale, la memorizzazione nella cache.
Ecco la Program.cs dell'app daemon che chiama un'API downstream:
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()}");
Ecco la Program.cs di un'app daemon che chiama 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);
Usando un client HTTP come Axios, chiamare l'URI dell'endpoint API con un token di accesso come connessione di autorizzazione.
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()
Proprietà AuthenticationResult in MSAL.NET
I metodi per acquisire i token restituiscono AuthenticationResult
. Per i metodi asincroni, restituisce Task<AuthenticationResult>
.
In MSAL.NET AuthenticationResult
espone:
AccessToken
per l'API Web per accedere alle risorse. Questo parametro è una stringa, in genere un token JWT con codifica Base 64. Il client non deve mai guardare all'interno del token di accesso. Il formato non è garantito per rimanere stabile e può essere crittografato per la risorsa. La scrittura di codice che dipende dal contenuto del token di accesso nel client è una delle principali fonti di errori e interruzioni della logica client. Per altre informazioni, vedere Token di accesso.
IdToken
per l'utente. Questo parametro è un token JWT codificato. Per altre informazioni, vedere Token ID.
ExpiresOn
indica la data e l'ora di scadenza del token.
TenantId
contiene il tenant in cui è stato trovato l'utente. Per gli utenti guest negli scenari di Microsoft Entra B2B, l'ID tenant è il tenant guest, non il tenant univoco.
Quando il token viene recapitato per un utente, AuthenticationResult
contiene anche informazioni su questo utente. Per i flussi client riservati in cui i token vengono richiesti senza alcun utente per l'applicazione, queste informazioni utente sono Null.
- Oggetto
Scopes
per il quale è stato rilasciato il token.
- ID univoco per l'utente.
IAccount
MSAL.NET definisce la nozione di un account tramite l'interfaccia IAccount
. Questa modifica che causa un'interruzione fornisce la semantica corretta. Lo stesso utente può avere diversi account, in directory Microsoft Entra diverse. Inoltre, MSAL.NET fornisce informazioni migliori in caso di scenari guest perché vengono fornite informazioni sull'account home.
Il diagramma seguente illustra la struttura dell'interfaccia IAccount
.
La AccountId
classe identifica un account in un tenant specifico con le proprietà illustrate nella tabella seguente.
Proprietà |
Descrizione |
TenantId |
Rappresentazione di stringa per un GUID, ovvero l'ID del tenant in cui risiede l'account. |
ObjectId |
Rappresentazione di stringa per un GUID, ovvero l'ID dell'utente proprietario dell'account nel tenant. |
Identifier |
Identificatore univoco per l'account. Identifier è la concatenazione di ObjectId e TenantId separate da una virgola. Non sono codificati in Base 64. |
L'interfaccia IAccount
rappresenta informazioni su un singolo account. Lo stesso utente può essere presente in tenant diversi, il che significa che un utente può avere più account. I relativi membri sono illustrati nella tabella seguente.
Proprietà |
Descrizione |
Username |
Stringa che contiene il valore visualizzabile in formato UserPrincipalName (UPN), ad esempio john.doe@contoso.com. Questa stringa può essere null, a differenza di HomeAccountId e HomeAccountId.Identifier, che non sarà null. Questa proprietà sostituisce la DisplayableId proprietà di IUser nelle versioni precedenti di MSAL.NET. |
Environment |
Stringa che contiene il provider di identità per questo account, login.microsoftonline.com ad esempio . Questa proprietà sostituisce la IdentityProvider proprietà di , ad eccezione del IUser fatto che IdentityProvider disponeva anche di informazioni sul tenant, oltre all'ambiente cloud. In questo caso, il valore è solo l'host. |
HomeAccountId |
ID account dell'account home per l'utente. Questa proprietà identifica in modo univoco l'utente nei tenant di Microsoft Entra. |
Usare il token per chiamare un'API protetta
Dopo AuthenticationResult
essere stato restituito da MSAL in result
, aggiungerlo all'intestazione di autorizzazione HTTP prima di effettuare la chiamata per accedere all'API Web protetta.
httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
// Call the web API.
HttpResponseMessage response = await _httpClient.GetAsync(apiUri);
...
}
Per le app daemon, le API Web chiamate devono essere preapprovate. Non esiste alcun consenso incrementale con le app daemon. Non esiste alcuna interazione dell'utente. L'amministratore del tenant deve fornire il consenso in anticipo per l'applicazione e tutte le autorizzazioni API. Se si vogliono chiamare diverse API, acquisire un token per ogni risorsa, ogni volta che si chiama AcquireTokenForClient
. MSAL usa la cache dei token dell'applicazione per evitare chiamate di servizio non necessarie.