Uwierzytelnianie Microsoft Graph przy użyciu MSAL

Wprowadzenie do uwierzytelniania Graph

Microsoft Graph jest jednolitym API REST do dostępu do danych w usługach Microsoft 365, takich jak Outlook, OneDrive i Teams. Aspose.Email dla .NET zapewnia wbudowane IGraphClient interfejs, który upraszcza interakcję z Microsoft Graph, oferując wysokopoziomowe, silnie typowane API.

Używając IGraphClient, możesz uwierzytelnić się przez MSAL, a następnie wykonać typowe operacje, takie jak:

  • Zarządzanie folderami poczty (wyświetlanie, tworzenie, aktualizacja, kopiowanie, usuwanie)

  • Praca z wiadomościami i załącznikami (odczyt, wysyłanie, przenoszenie i manipulowanie zawartością)

  • Dostęp i zarządzanie wydarzeniami kalendarza, kontaktami, kategoriami, regułami, zadaniami i notatnikami OneNote

Poniższe przykłady pokazują, jak utworzyć i skonfigurować GraphClient instancję z tokenem dostępu, a następnie typowe scenariusze użycia.

Uwierzytelnienie Microsoft Graph przy użyciu MSAL.NET

Aby pracować z Microsoft Graph przy użyciu Aspose.Email dla .NET, najpierw musisz uwierzytelnić swoją aplikację. Można to zrobić, implementując ITokenProvider interfejsu, który dostarcza tokeny dostępu do IGraphClient.

Ta sekcja prowadzi Cię przez konfigurowanie MSAL.NET w celu uzyskania tokenów i inicjalizacji IGraphClient do wysyłania uwierzytelnionych żądań do usług Microsoft Graph.

Biblioteka Microsoft Authentication Library (MSAL)

Krok 1: Definicja klasy AccessParameters

Utwórz prostą klasę do przechowywania poświadczeń Microsoft 365 oraz powiązanej konfiguracji.

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";
}

Krok 2: Zainstalowanie pakietu MSAL.NET

Dodaj Microsoft.Identity.Client Pakiet NuGet do Twojego projektu. Zawiera Microsoft Authentication Library (MSAL) używaną do uzyskiwania tokenów dostępu.

dotnet add package Microsoft.Identity.Client

Krok 3: Implementacja interfejsu ITokenProvider

Utwórz GraphTokenProvider klasa, która implementuje ITokenProvider interfejs. Ta klasa będzie używać biblioteki MSAL.NET do uzyskania tokenu dostępu.

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;
    }

Krok 4: Utworzenie instancji ITokenProvider

Gdy Twój GraphTokenProvider klasa jest gotowa, możesz utworzyć jej instancję przy użyciu poświadczeń aplikacji.

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);

Krok 5: Inicjalizacja IGraphClient

Użyj dostawcy tokenów do utworzenia uwierzytelnionego IGraphClient instancja. Ustaw typ zasobu i ID, aby rozpocząć interakcję z Microsoft Graph.

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

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

Twój IGraphClient jest teraz uwierzytelniony i gotowy do wysyłania żądań do Microsoft Graph w imieniu Twojej aplikacji.

Połączenie z punktem końcowym GCC High w Microsoft Graph

Aspose.Email GraphClient obsługuje połączenie z punktem końcowym Microsoft Graph GCC High poprzez ustawienie EndPoint właściwość ręcznie. Ustaw właściwość na https://graph.microsoft.us przed wykonywaniem żądań.

Poniższy przykład kodu pokazuje, jak skonfigurować GraphClient aby połączyć się z punktem końcowym GCC High w celu wyświetlania listy folderów i pobierania wiadomości.

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

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

Asynchroniczne uwierzytelnianie w Microsoft Graph

Użyj Aspose.Email.Clients.Graph.IGraphClientAsync interfejs do wykonywania asynchronicznych operacji z GraphClient. The GraphClient.GetClientAsync(ITokenProvider, string) i GraphClient.GetClientAsync(IMultipleServicesTokenProvider, string) metody pozwalają zainicjować asynchroniczne klienty Graph. Poniższy przykład kodu pokazuje, jak skonfigurować uwierzytelnionego klienta Microsoft Graph przy użyciu poświadczeń aplikacji Azure AD, aby mógł działać na skrzynce pocztowej konkretnego użytkownika:

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";