Аутентифікація Microsoft Graph за допомогою MSAL

Вступ до аутентифікації Graph

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

Використовуючи IGraphClient, ви можете автентифікуватися через MSAL, а потім виконати типові операції, такі як:

  • Керування поштовими папками (перелік, створення, оновлення, копіювання, видалення)

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

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

Нижче наведені приклади, які демонструють, як створити та налаштувати GraphClient екземпляр з токеном доступу, після чого слідують типові сценарії використання.

Автентифікація Microsoft Graph за допомогою MSAL.NET

Щоб працювати з Microsoft Graph, використовуючи Aspose.Email для .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. The 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";