Autenticación de Microsoft Graph con MSAL
Introducción a la Autenticación de Graph
Microsoft Graph es una API REST unificada para acceder a datos de los servicios de Microsoft 365 como Outlook, OneDrive y Teams. Aspose.Email para .NET proporciona una IGraphClient interfaz que simplifica la interacción con Microsoft Graph al ofrecer una API de alto nivel y tipada fuertemente.
Usando IGraphClient, puede autenticarse vía MSAL, luego realizar operaciones comunes como:
-
Gestionar carpetas de correo (listar, crear, actualizar, copiar, eliminar)
-
Trabajar con mensajes y archivos adjuntos (leer, enviar, mover y manipular contenido)
-
Acceder y gestionar eventos de calendario, contactos, categorías, reglas, tareas y cuadernos de OneNote
Los siguientes ejemplos demuestran cómo crear y configurar un GraphClient instancia con un token de acceso, seguido de escenarios de uso típicos.
Autenticar Microsoft Graph con MSAL.NET
Para trabajar con Microsoft Graph usando Aspose.Email para .NET, primero debe autenticar su aplicación. Esto puede hacerse implementando el ITokenProvider interfaz, que provee tokens de acceso al IGraphClient.
Esta sección le guía a través de la configuración de MSAL.NET para obtener tokens e inicializar el IGraphClient para enviar solicitudes autenticadas a los servicios de Microsoft Graph.
Biblioteca de Autenticación de Microsoft (MSAL)
Paso 1: Definir la Clase AccessParameters
Cree una clase sencilla para almacenar sus credenciales de Microsoft 365 y la configuración relacionada.
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";
}
Paso 2: Instalar el Paquete MSAL.NET
Añada el Microsoft.Identity.Client Paquete NuGet a su proyecto. Contiene la Microsoft Authentication Library (MSAL) utilizada para obtener tokens de acceso.
dotnet add package Microsoft.Identity.Client
Paso 3: Implementar la Interfaz ITokenProvider
Cree un GraphTokenProvider clase que implementa el ITokenProvider interfaz. Esta clase usará la biblioteca MSAL.NET para adquirir un token de acceso.
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;
}
Paso 4: Crear una Instancia ITokenProvider
Una vez que su GraphTokenProvider la clase está lista, puede instanciarla usando las credenciales de su aplicación.
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);
Paso 5: Inicializar el IGraphClient
Utilice el proveedor de tokens para crear un IGraphClient instancia. Establezca el tipo de recurso y el ID para comenzar a interactuar con Microsoft Graph.
using var client = GraphClient.GetClient(tokenProvider, accessParams.TenantId);
client.Resource = ResourceType.Users;
client.ResourceId = accessParams.UserId;
Su IGraphClient ahora está autenticado y listo para enviar solicitudes a Microsoft Graph en nombre de su aplicación.
Conectar al Endpoint GCC High en Microsoft Graph
Aspose.Email GraphClient admite la conexión al endpoint Microsoft Graph GCC High configurando el EndPoint propiedad manualmente. Establezca la propiedad a https://graph.microsoft.us antes de realizar solicitudes.
El siguiente ejemplo de código muestra cómo configurar el GraphClient para conectarse al endpoint GCC High para listar carpetas y recuperar mensajes.
client.EndPoint = "https://graph.microsoft.us";
var folders = client.ListFolders();
string folderId = folders.Find(x => x.DisplayName == "Inbox").ItemId;
var msgs = client.ListMessages(folderId);
Autenticación Asíncrona a Microsoft Graph
Utilice el Aspose.Email.Clients.Graph.IGraphClientAsync interfaz para realizar operaciones asincrónicas con GraphClient. El GraphClient.GetClientAsync(ITokenProvider, string) y GraphClient.GetClientAsync(IMultipleServicesTokenProvider, string) Los métodos le permiten inicializar clientes Graph asincrónicos. El siguiente ejemplo de código muestra cómo configurar un cliente Microsoft Graph autenticado con credenciales de aplicación Azure AD para que pueda operar en el buzón de un usuario específico:
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";