Аутентификация Microsoft Graph с MSAL

Введение в аутентификацию Graph

Microsoft Graph является единым REST API для доступа к данным различных сервисов Microsoft 365, таких как Outlook, OneDrive и Teams. Aspose.Email for .NET предоставляет встроенный IGraphClient интерфейс, упрощающий взаимодействие с Microsoft Graph, предоставляя высокоуровневый, статически типизированный API.

Используя IGraphClient, вы можете аутентифицироваться через MSAL, а затем выполнять общие операции, такие как:

  • Управление почтовыми папками (список, создание, обновление, копирование, удаление)

  • Работа с сообщениями и вложениями (чтение, отправка, перемещение и манипуляция содержимым)

  • Доступ и управление событиями календаря, контактами, категориями, правилами, задачами и блокнотами OneNote

Следующие примеры демонстрируют, как создать и настроить GraphClient экземпляр с токеном доступа, после чего следуют типичные сценарии использования.

Аутентифицировать Microsoft Graph с MSAL.NET

Чтобы работать с Microsoft Graph, используя Aspose.Email for .NET, сначала необходимо аутентифицировать приложение. Это можно сделать, реализовав ITokenProvider интерфейса, который предоставляет токены доступа к IGraphClient.

Этот раздел проведёт вас через настройку MSAL.NET для получения токенов и инициализацию IGraphClient для отправки аутентифицированных запросов к сервисам Microsoft Graph.

Библиотека Microsoft Authentication Library (MSAL)

Шаг 1: Определить класс AccessParameters

Создайте простой класс для хранения учётных данных Microsoft 365 и соответствующей конфигурации.

public class AccessParameters
{
    public string TenantId { get; init; }
    public string ClientId { get; init; }
    public string ClientSecret { get; init; }
    public string UserId { get; init; }
    public Uri Authority => new ($"https://login.microsoftonline.com/{TenantId}");
    public string ApiUrl => "https://graph.microsoft.com/.default";
}

Шаг 2: Установить пакет MSAL.NET

Добавьте Microsoft.Identity.Client Пакет NuGet для вашего проекта. Он содержит Microsoft Authentication Library (MSAL), используемую для получения токенов доступа.

dotnet add package Microsoft.Identity.Client

Шаг 3: Реализовать интерфейс ITokenProvider

Создайте GraphTokenProvider класс, реализующий ITokenProvider интерфейс. Этот класс будет использовать библиотеку MSAL.NET для получения токена доступа.

using Microsoft.Identity.Client;
using Microsoft.Identity.Web;
using Aspose.Email.Clients;

public class GraphTokenProvider : ITokenProvider
{
    private readonly IConfidentialClientApplication _app;
    private readonly string[] _scopes;
    private string? _token;

    public GraphTokenProvider(AccessParameters accessParams)
    {
        _app = ConfidentialClientApplicationBuilder.Create(accessParams.ClientId)
            .WithClientSecret(accessParams.ClientSecret)
            .WithAuthority(accessParams.Authority)
            .Build();

        _app.AddInMemoryTokenCache();

        _scopes = new[] { accessParams.ApiUrl };
    }

    public void Dispose()
    {
        throw new NotImplementedException();
    }

    public OAuthToken GetAccessToken()
    {
        return GetAccessToken(false);
    }

    public OAuthToken GetAccessToken(bool ignoreExistingToken)
    {
        if (!ignoreExistingToken && _token != null)
        {
            return new OAuthToken(_token);
        }

        _token = GetAccessTokenAsync().GetAwaiter().GetResult();
        return new OAuthToken(_token);
    }

    private async Task<string?> GetAccessTokenAsync()
    {
        AuthenticationResult? result;

        try
        {
            result = await _app.AcquireTokenForClient(_scopes)
                .ExecuteAsync();

            Console.WriteLine("Token acquired");
        }
        catch (MsalServiceException ex) when (ex.Message.Contains("AADSTS70011"))
        {
            Console.WriteLine("Scope provided is not supported");
            result = null;
        }

        if (result == null) return null;
        _token = result.AccessToken;
        return result.AccessToken;
    }

Шаг 4: Создать экземпляр ITokenProvider

Как только ваш GraphTokenProvider класс готов, вы можете создать его экземпляр, используя учётные данные вашего приложения.

var accessParams = new AccessParameters()
{
    TenantId = "Your Tenant ID",
    ClientId = "Your Client ID",
    ClientSecret = "Your Client Secret",
    UserId = "User's Object ID"
};

var tokenProvider = new GraphTokenProvider(accessParams);

Шаг 5: Инициализировать IGraphClient

Используйте провайдер токенов для создания аутентифицированного IGraphClient экземпляр. Установите тип ресурса и ID, чтобы начать взаимодействие с Microsoft Graph.

using var client = GraphClient.GetClient(tokenProvider, accessParams.TenantId);

client.Resource = ResourceType.Users;
client.ResourceId = accessParams.UserId;

Ваш IGraphClient теперь аутентифицирован и готов отправлять запросы к Microsoft Graph от имени вашего приложения.

Подключение к конечной точке GCC High в Microsoft Graph

Aspose.Email GraphClient поддерживает подключение к конечной точке Microsoft Graph GCC High путем установки EndPoint свойство вручную. Установите свойство в https://graph.microsoft.us перед выполнением запросов.

Ниже приведён пример кода, показывающий, как настроить GraphClient для подключения к конечной точке GCC High с целью перечисления папок и получения сообщений.

client.EndPoint = "https://graph.microsoft.us";

var folders = client.ListFolders();
string folderId = folders.Find(x => x.DisplayName == "Inbox").ItemId;
var msgs = client.ListMessages(folderId);

Асинхронная аутентификация в Microsoft Graph

Используйте Aspose.Email.Clients.Graph.IGraphClientAsync интерфейс для выполнения асинхронных операций с GraphClient. Это GraphClient.GetClientAsync(ITokenProvider, string) и GraphClient.GetClientAsync(IMultipleServicesTokenProvider, string) методы позволяют инициализировать асинхронные клиенты Graph. Ниже приведён пример кода, демонстрирующий, как настроить аутентифицированный клиент Microsoft Graph с учётными данными приложения Azure AD, чтобы он мог работать с почтовым ящиком конкретного пользователя:

var accessParameters = Settings.User1;

var provider = new AzureConfidentialTokenProvider(
    accessParameters.TenantId,
    accessParameters.ClientId,
    accessParameters.ClientSecret);

var client = GraphClient.GetClientAsync(provider, accessParameters.TenantId);

client.Resource = Aspose.Email.Clients.Graph.ResourceType.Users;
client.ResourceId = accessParameters.Username;
client.EndPoint = "https://graph.microsoft.com";