Aplikace démona .NET můžou volat webové rozhraní API. Aplikace démona .NET můžou také volat několik předschválené webové rozhraní API.
Microsoft.Identity.Web abstrahuje složitost MSAL.NET. Poskytuje rozhraní API vyšší úrovně, která zpracovávají interní MSAL.NET za vás, jako je zpracování chyb podmíněného přístupu, ukládání do mezipaměti.
Tady je Program.cs aplikace démona, která volá podřízené rozhraní 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()}");
Tady je Program.cs aplikace démona, která volá 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);
Pomocí klienta HTTP, jako je Axios, volejte identifikátor URI koncového bodu rozhraní API s přístupovým tokenem jako nosný autorizační token.
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()
Vlastnosti AuthenticationResult v MSAL.NET
Metody získání tokenů vrátí AuthenticationResult
. U asynchronních metod Task<AuthenticationResult>
vrátí hodnotu.
V MSAL.NET AuthenticationResult
zveřejňuje:
AccessToken
pro přístup k prostředkům webového rozhraní API. Tento parametr je řetězec, obvykle kódovaný jako Base-64 JWT. Klient by nikdy neměl hledat uvnitř přístupového tokenu. Formát není zaručený, že zůstane stabilní a může být pro prostředek zašifrovaný. Psaní kódu, který závisí na obsahu přístupového tokenu na klientovi, je jedním z největších zdrojů chyb a přerušení logiky klienta. Další informace najdete v tématu Přístupové tokeny.
IdToken
pro uživatele. Tento parametr je kódovaný JWT. Další informace najdete v tématu Tokeny ID.
ExpiresOn
udává datum a čas vypršení platnosti tokenu.
TenantId
obsahuje tenanta, ve kterém byl uživatel nalezen. Pro uživatele typu host ve scénářích Microsoft Entra B2B je ID tenanta typu host, nikoli jedinečný tenant.
Při doručení tokenu pro uživatele AuthenticationResult
obsahuje také informace o tomto uživateli. V případě důvěrných toků klientů, u kterých jsou tokeny požadovány bez uživatele pro aplikaci, mají tyto informace o uživateli hodnotu null.
- Token
Scopes
, pro který byl vydán.
- Jedinečné ID uživatele.
IAccount
MSAL.NET definuje pojem účtu prostřednictvím IAccount
rozhraní. Tato změna způsobující chybu poskytuje správnou sémantiku. Stejný uživatel může mít několik účtů v různých adresářích Microsoft Entra. Také MSAL.NET poskytuje lepší informace v případě scénářů hosta, protože jsou k dispozici informace o domovském účtu.
Následující diagram znázorňuje strukturu IAccount
rozhraní.
Třída AccountId
identifikuje účet v konkrétním tenantovi s vlastnostmi zobrazenými v následující tabulce.
Vlastnost |
Popis |
TenantId |
Řetězcové vyjádření identifikátoru GUID, což je ID tenanta, ve kterém se účet nachází. |
ObjectId |
Řetězcové vyjádření identifikátoru GUID, což je ID uživatele, který vlastní účet v tenantovi. |
Identifier |
Jedinečný identifikátor účtu. Identifier je zřetězení ObjectId čárkou a TenantId oddělené čárkou. Nejsou kódované v base 64. |
Rozhraní IAccount
představuje informace o jednom účtu. Stejný uživatel může být přítomný v různých tenantech, což znamená, že uživatel může mít více účtů. Její členové jsou zobrazeni v následující tabulce.
Vlastnost |
Popis |
Username |
Řetězec, který obsahuje zobrazenou hodnotu ve formátu UserPrincipalName (UPN), například john.doe@contoso.com. Tento řetězec může mít hodnotu null, na rozdíl od HomeAccountId a HomeAccountId.Identifier, který nebude null. Tato vlastnost nahrazuje DisplayableId vlastnost IUser v předchozích verzích MSAL.NET. |
Environment |
Řetězec, který obsahuje zprostředkovatele identity pro tento účet, login.microsoftonline.com například . Tato vlastnost nahrazuje IdentityProvider vlastnost kromě IdentityProvider cloudového IUser prostředí také informace o tenantovi. V této části je hodnota pouze hostitelem. |
HomeAccountId |
ID účtu domovského účtu uživatele. Tato vlastnost jednoznačně identifikuje uživatele napříč tenanty Microsoft Entra. |
Použití tokenu k volání chráněného rozhraní API
Jakmile AuthenticationResult
msAL result
vrátí, přidejte ji do autorizační hlavičky HTTP před voláním pro přístup k chráněnému webovému rozhraní API.
httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
// Call the web API.
HttpResponseMessage response = await _httpClient.GetAsync(apiUri);
...
U aplikací démona musí být webová rozhraní API, která voláte, předem schválena. U aplikací démona neexistuje žádný přírůstkový souhlas. (Neexistuje žádná interakce uživatele.) Správce tenanta musí předem poskytnout souhlas pro aplikaci a všechna oprávnění rozhraní API. Pokud chcete volat několik rozhraní API, získejte token pro každý prostředek při každém volání AcquireTokenForClient
. MsAL používá mezipaměť tokenů aplikace, aby se zabránilo zbytečným voláním služby.