Управляющие приложения .NET могут вызывать веб-API. Приложения управляющей программы .NET также могут вызывать несколько предварительно подготовленных веб-API.
Microsoft.Identity.Web абстрагирует сложность MSAL.NET. Он предоставляет api более высокого уровня, которые обрабатывают внутренние MSAL.NET для вас, такие как обработка ошибок условного доступа, кэширование.
Ниже приведены Program.cs приложения управляющей программы, вызывающего подчиненный 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()}");
Ниже приведены Program.cs приложения управляющей программы, вызывающего 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);
С помощью клиента HTTP, например Axios, вызовите API по URI конечной точки, передав маркер доступа как носитель авторизации.
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 в MSAL.NET
Для получения маркеров методы возвращают объект AuthenticationResult
. Для асинхронных методов возвращается Task<AuthenticationResult>
.
MSAL.NET AuthenticationResult
предоставляет следующие параметры:
AccessToken
— обеспечивает для веб-API доступ к ресурсам. Это строковый параметр, который обычно представляет собой маркер JWT в кодировке Base-64. Клиент никогда не должен считывать содержимое маркера доступа. Стабильность формата не гарантируется, и маркер может быть зашифрован для конкретного ресурса. Написание кода, который зависит от содержимого маркера доступа на стороне клиента, является одним из основных источников для ошибок и сбоев в логике клиента. Дополнительные сведения см. в разделе Маркеры доступа.
IdToken
— предназначается для пользователей. Этот параметр является зашифрованным маркером JWT. Дополнительные сведения см. в разделе Маркеры идентификации.
ExpiresOn
— сообщает дату и время истечения срока действия маркера.
TenantId
— содержит сведения о клиенте, в котором был найден пользователь. Для гостевых пользователей в сценариях Microsoft Entra B2B идентификатор клиента является гостевым клиентом, а не уникальным клиентом.
При предоставлении маркера для пользователя в объекте AuthenticationResult
также содержится информация об этом пользователе. Для потоков конфиденциальных клиентов, где маркеры запрашиваются без пользователя для приложения, эта информация о пользователе имеет значение NULL.
Scopes
— обозначает области, для которых выдан маркер.
- Уникальный идентификатор пользователя.
IAccount
В MSAL.NET понятие учетной записи определяется через интерфейс IAccount
. Такое радикальное изменение обеспечивает правильную семантику. Один и тот же пользователь может иметь несколько учетных записей в разных каталогах Microsoft Entra. Также MSAL.NET предоставляет более подробные сведения в сценариях с гостевым входом благодаря добавлению информации о домашней учетной записи.
Структура интерфейса IAccount
представлена на следующей схеме.
Класс AccountId
определяет учетную запись в конкретном клиенте с помощью свойств, приведенных в следующей таблице.
Свойство |
Description |
TenantId |
Строковое представление идентификатора GUID, которое является идентификатором клиента, где находится учетная запись. |
ObjectId |
Строковое представление идентификатора GUID, являющееся идентификатором пользователя, которому принадлежит учетная запись в клиенте. |
Identifier |
Уникальный идентификатор для учетной записи. Identifier является объединением ObjectId и TenantId , разделенных запятой. Для этих значений шифрование Base 64 не применяется. |
Интерфейс IAccount
предоставляет сведения об одной учетной записи. Один и тот же пользователь может быть в разных клиентах, это означает, что у пользователя может быть несколько учетных записей. Компоненты этого интерфейса представлены в следующей таблице.
Свойство |
Description |
Username |
Строка с отображаемым значением в формате UserPrincipalName (UPN), например john.doe@contoso.com. Эта строка может иметь значение NULL, в отличие от свойств HomeAccountId и HomeAccountId.Identifier, у которых не может быть значения NULL. Это свойство заменяет свойство DisplayableId интерфейса IUser из предыдущих версий MSAL.NET. |
Environment |
Строка с поставщиком удостоверений для этой учетной записи, например login.microsoftonline.com . Это свойство заменяет свойство IdentityProvider интерфейса IUser , за исключением того, что в свойстве IdentityProvider также содержались сведения о клиенте в дополнение к информации об облачной среде. Содержащееся здесь значение определяет только узел. |
HomeAccountId |
Идентификатор домашней учетной записи пользователя. Это свойство однозначно идентифицирует пользователя в клиентах Microsoft Entra. |
Использование маркера для вызова защищенного API
После того как AuthenticationResult
возвращается MSAL в переменную result
, ее нужно добавить в HTTP-заголовок авторизации перед тем, как делать вызов для доступа к защищенному веб-API.
httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
// Call the web API.
HttpResponseMessage response = await _httpClient.GetAsync(apiUri);
...
Для приложений управляющей программы необходимо предварительно применить веб-API, которые необходимо вызвать. Для управляющих приложений не применяется добавочное согласие. (Нет никакого взаимодействия с пользователем.) Администратор арендатора должен заранее предоставить согласие на доступ для приложения и все разрешения для API. Если вы хотите вызвать несколько API, получите отдельный токен для каждого ресурса, каждый раз вызывая AcquireTokenForClient
. MSAL использует кэш маркеров приложения, чтобы избежать ненужных вызовов служб.