Удостоверяване в 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";