Microsoft Graph-autentisering med MSAL

Introduktion till Graph‑autentisering

Microsoft Graph är ett enhetligt REST‑API för åtkomst till data över Microsoft 365‑tjänster som Outlook, OneDrive och Teams. Aspose.Email för .NET tillhandahåller en inbyggd IGraphClient gränssnitt som förenklar interaktionen med Microsoft Graph genom att erbjuda ett hög‑nivå, starkt typat API.

Använder IGraphClient, kan du autentisera via MSAL och sedan utföra vanliga operationer såsom:

  • Hantera e‑postmappar (lista, skapa, uppdatera, kopiera, radera)

  • Arbeta med meddelanden och bilagor (läsa, skicka, flytta och manipulera innehåll)

  • Åtkomst till och hantering av kalenderevent, kontakter, kategorier, regler, uppgifter och OneNote‑anteckningsböcker

Följande exempel visar hur du skapar och konfigurerar en GraphClient instans med en åtkomst‑token, följt av typiska användningsscenarier.

Autentisera Microsoft Graph med MSAL.NET

För att arbeta med Microsoft Graph med Aspose.Email för .NET måste du först autentisera din applikation. Det kan göras genom att implementera ITokenProvider gränssnitt, som levererar åtkomst‑token till IGraphClient.

Detta avsnitt guidar dig genom att konfigurera MSAL.NET för att erhålla token och initiera IGraphClient för att skicka autentiserade förfrågningar till Microsoft Graph‑tjänster.

Microsoft Authentication Library (MSAL)

Steg 1: Definiera AccessParameters‑klassen

Skapa en enkel klass för att lagra dina Microsoft 365‑uppgifter och relaterad konfiguration.

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

Steg 2: Installera MSAL.NET‑paketet

Lägg till Microsoft.Identity.Client NuGet‑paket till ditt projekt. Det innehåller Microsoft Authentication Library (MSAL) som används för att erhålla åtkomst‑token.

dotnet add package Microsoft.Identity.Client

Steg 3: Implementera ITokenProvider‑gränssnittet

Skapa en GraphTokenProvider klass som implementerar ITokenProvider gränssnitt. Denna klass kommer att använda MSAL.NET‑biblioteket för att erhålla en access‑token.

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

Steg 4: Skapa en ITokenProvider‑instans

När du har din GraphTokenProvider klass är klar, du kan skapa en instans med dina app‑uppgifter.

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

Steg 5: Initiera IGraphClient

Använd token‑providern för att skapa en autentiserad IGraphClient instans. Ställ in resursens typ och ID för att börja interagera med Microsoft Graph.

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

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

Din IGraphClient är nu autentiserad och klar att skicka förfrågningar till Microsoft Graph på uppdrag av din applikation.

Anslut till GCC High‑endpoint i Microsoft Graph

Aspose.Email GraphClient stöder anslutning till Microsoft Graph GCC High‑endpoint genom att sätta EndPoint egenskap manuellt. Ställ in egenskapen till https://graph.microsoft.us innan du gör förfrågningar.

Följande kodexempel visar hur du konfigurerar GraphClient för att ansluta till GCC High‑endpointen för att lista mappar och hämta meddelanden.

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

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

Asynkron autentisering till Microsoft Graph

Använd Aspose.Email.Clients.Graph.IGraphClientAsync gränssnitt för att utföra asynkrona operationer med GraphClient. Klassen GraphClient.GetClientAsync(ITokenProvider, string) och GraphClient.GetClientAsync(IMultipleServicesTokenProvider, string) metoder låter dig initiera asynkrona Graph‑klienter. Följande kodexempel visar hur du konfigurerar en autentiserad Microsoft Graph‑klient med Azure AD‑applikationsuppgifter så att den kan arbeta med en specifik användares brevlåda:

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