.NET-daemonappar kan anropa ett webb-API. .NET-daemonappar kan också anropa flera förgodkända webb-API:er.
Microsoft.Identity.Web sammanfattar komplexiteten i MSAL.NET. Det ger dig API:er på högre nivå som hanterar interna MSAL.NET åt dig, till exempel bearbetning av fel med villkorsstyrd åtkomst, cachelagring.
Här är Program.cs för daemonappen som anropar ett underordnat API:
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()}");
Här är Program.cs för en daemon-app som anropar 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);
Med hjälp av en HTTP-klient som Axios anropar du API-slutpunkts-URI:n med en åtkomsttoken som auktoriseringsbärare.
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-egenskaper i MSAL.NET
Metoderna för att hämta token returnerar AuthenticationResult
. För asynkrona metoder Task<AuthenticationResult>
returnerar.
I MSAL.NET AuthenticationResult
exponeras:
AccessToken
för att webb-API:et ska få åtkomst till resurser. Den här parametern är en sträng, vanligtvis en Base-64-kodad JWT. Klienten bör aldrig titta i åtkomsttoken. Formatet är inte garanterat stabilt och kan krypteras för resursen. Att skriva kod som är beroende av åtkomsttokeninnehåll på klienten är en av de största felkällorna och klientlogikbrytningarna. Mer information finns i Åtkomsttoken.
IdToken
för användaren. Den här parametern är en kodad JWT. Mer information finns i ID-token.
ExpiresOn
anger datum och tid när token upphör att gälla.
TenantId
innehåller klientorganisationen där användaren hittades. För gästanvändare i Microsoft Entra B2B-scenarier är klientorganisations-ID:t gästklientorganisationen, inte den unika klientorganisationen.
När token levereras för en användare innehåller AuthenticationResult
även information om den här användaren. För konfidentiella klientflöden där token begärs utan användare för programmet är den här användarinformationen null.
- För
Scopes
vilken token utfärdades.
- Det unika ID:t för användaren.
IAccount
MSAL.NET definierar begreppet konto via IAccount
gränssnittet. Den här icke-bakåtkompatibla ändringen ger rätt semantik. Samma användare kan ha flera konton i olika Microsoft Entra-kataloger. Dessutom ger MSAL.NET bättre information när det gäller gästscenarier eftersom hemkontoinformation tillhandahålls.
Följande diagram visar gränssnittets IAccount
struktur.
Klassen AccountId
identifierar ett konto i en specifik klientorganisation med de egenskaper som visas i följande tabell.
Property |
beskrivning |
TenantId |
En strängrepresentation för ett GUID, vilket är ID:t för klientorganisationen där kontot finns. |
ObjectId |
En strängrepresentation för ett GUID, vilket är ID för den användare som äger kontot i klientorganisationen. |
Identifier |
Unik identifierare för kontot. Identifier är sammanlänkningen av ObjectId och TenantId avgränsad med ett kommatecken. De är inte base 64-kodade. |
Gränssnittet IAccount
representerar information om ett enda konto. Samma användare kan finnas i olika klientorganisationer, vilket innebär att en användare kan ha flera konton. Dess medlemmar visas i följande tabell.
Property |
beskrivning |
Username |
En sträng som innehåller det visningsbara värdet i UPN-format (UserPrincipalName), till exempel john.doe@contoso.com. Den här strängen kan vara null, till skillnad från HomeAccountId och HomeAccountId.Identifier, som inte är null. Den här egenskapen ersätter DisplayableId egenskapen IUser för i tidigare versioner av MSAL.NET. |
Environment |
En sträng som innehåller identitetsprovidern för det här kontot, till exempel login.microsoftonline.com . Den här egenskapen ersätter IdentityProvider egenskapen IUser , förutom den som IdentityProvider också hade information om klientorganisationen, utöver molnmiljön. Här är värdet bara värden. |
HomeAccountId |
Konto-ID för hemkontot för användaren. Den här egenskapen identifierar användaren unikt i Microsoft Entra-klienter. |
Använda token för att anropa ett skyddat API
När AuthenticationResult
har returnerats av MSAL i lägger du till det i result
HTTP-auktoriseringshuvudet innan du anropar för att komma åt det skyddade webb-API:et.
httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
// Call the web API.
HttpResponseMessage response = await _httpClient.GetAsync(apiUri);
...
För daemonappar måste de webb-API:er som du anropar godkännas i förväg. Det finns inget inkrementellt medgivande med daemon-appar. (Det finns ingen användarinteraktion.) Klientadministratören måste ge medgivande i förväg för programmet och alla API-behörigheter. Om du vill anropa flera API:er hämtar du en token för varje resurs, varje gång du anropar AcquireTokenForClient
. MSAL använder cacheminnet för programtoken för att undvika onödiga tjänstanrop.