Autentizace Microsoft Graph pomocí MSAL

Úvod do autentizace Graph

Microsoft Graph je jednotné REST API pro přístup k datům napříč službami Microsoft 365, jako jsou Outlook, OneDrive a Teams. Aspose.Email pro .NET poskytuje vestavěné IGraphClient rozhraní, které usnadňuje interakci s Microsoft Graph nabídkou vysoce úrovňového, silně typovaného API.

Použití IGraphClient, můžete se autentizovat přes MSAL a poté provádět běžné operace, jako je:

  • Správa poštovních složek (výpis, vytvoření, aktualizace, kopírování, mazání)

  • Práce se zprávami a přílohami (čtení, odesílání, přesun, a manipulace s obsahem)

  • Přístup a správa kalendářních událostí, kontaktů, kategorií, pravidel, úkolů a OneNote zápisníků

Následující příklady ukazují, jak vytvořit a nakonfigurovat GraphClient instanci s přístupovým tokenem, následovanou typickými scénáři použití.

Autentizovat Microsoft Graph pomocí MSAL.NET

Pro práci s Microsoft Graph pomocí Aspose.Email pro .NET musíte nejprve autentizovat vaši aplikaci. To lze provést implementací ITokenProvider rozhraní, které poskytuje přístupové tokeny pro IGraphClient.

Tato sekce vás provede nastavením MSAL.NET pro získání tokenů a inicializací IGraphClient k odesílání autentizovaných požadavků na služby Microsoft Graph.

Knihovna Microsoft Authentication Library (MSAL)

Krok 1: Definovat třídu AccessParameters

Vytvořte jednoduchou třídu pro uložení vašich Microsoft 365 přihlašovacích údajů a související konfigurace.

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: Nainstalovat balíček MSAL.NET

Přidejte Microsoft.Identity.Client NuGet balíček do vašeho projektu. Obsahuje Microsoft Authentication Library (MSAL) používanou k získání přístupových tokenů.

dotnet add package Microsoft.Identity.Client

Krok 3: Implementovat rozhraní ITokenProvider

Vytvořte GraphTokenProvider třída, která implementuje ITokenProvider rozhraní. Tato třída použije knihovnu MSAL.NET k získání přístupového tokenu.

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: Vytvořit instanci ITokenProvider

Jakmile máte svůj GraphTokenProvider třída je připravena, můžete ji instancovat pomocí přihlašovacích údajů vaší aplikace.

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: Inicializovat IGraphClient

Použijte poskytovatele tokenů k vytvoření autentizovaného IGraphClient instanci. Nastavte typ a ID zdroje, abyste mohli začít komunikovat s Microsoft Graph.

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

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

Váš IGraphClient je nyní autentizován a připraven odesílat požadavky do Microsoft Graph jménem vaší aplikace.

Připojení k endpointu GCC High v Microsoft Graph

Aspose.Email GraphClient podporuje připojení k endpointu Microsoft Graph GCC High nastavením EndPoint vlastnost ručně. Nastavte vlastnost na https://graph.microsoft.us před odesláním požadavků.

Následující ukázkový kód demonstruje, jak nakonfigurovat GraphClient pro připojení k endpointu GCC High pro výpis složek a získávání zpráv.

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

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

Asynchronní autentizace k Microsoft Graph

Použijte Aspose.Email.Clients.Graph.IGraphClientAsync rozhraní pro provádění asynchronních operací s GraphClient. Třída GraphClient.GetClientAsync(ITokenProvider, string) a GraphClient.GetClientAsync(IMultipleServicesTokenProvider, string) metody vám umožňují inicializovat asynchronní Graph klienty. Následující ukázkový kód demonstruje, jak nakonfigurovat autentizovaného Microsoft Graph klienta s přihlašovacími údaji aplikace Azure AD, aby mohl pracovat s poštovní schránkou konkrétního uživatele:

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