Xác thực Microsoft Graph với MSAL

Giới thiệu về Xác thực Graph

Microsoft Graph là một REST API thống nhất để truy cập dữ liệu trên các dịch vụ Microsoft 365 như Outlook, OneDrive và Teams. Aspose.Email cho .NET cung cấp một IGraphClient giao diện giúp đơn giản hoá việc tương tác với Microsoft Graph bằng cách cung cấp một API cấp cao, strongly-typed.

Sử dụng IGraphClient, bạn có thể xác thực qua MSAL, sau đó thực hiện các thao tác chung như:

  • Quản lý thư mục mail (liệt kê, tạo, cập nhật, sao chép, xóa)

  • Làm việc với tin nhắn và tệp đính kèm (đọc, gửi, di chuyển và thao tác nội dung)

  • Truy cập và quản lý các sự kiện lịch, danh bạ, danh mục, quy tắc, nhiệm vụ và sổ tay OneNote

Các ví dụ sau đây minh họa cách tạo và cấu hình một GraphClient instance với một token truy cập, tiếp theo là các kịch bản sử dụng điển hình.

Xác thực Microsoft Graph với MSAL.NET

Để làm việc với Microsoft Graph sử dụng Aspose.Email cho .NET, bạn phải xác thực ứng dụng của mình trước. Điều này có thể thực hiện bằng cách triển khai ITokenProvider giao diện, cung cấp token truy cập cho IGraphClient.

Phần này hướng dẫn bạn cách thiết lập MSAL.NET để lấy token và khởi tạo IGraphClient để gửi các yêu cầu đã xác thực tới các dịch vụ Microsoft Graph.

Thư viện Xác thực Microsoft (MSAL)

Bước 1: Định nghĩa lớp AccessParameters

Tạo một lớp đơn giản để lưu trữ thông tin đăng nhập Microsoft 365 và cấu hình liên quan.

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

Bước 2: Cài đặt gói MSAL.NET

Thêm Microsoft.Identity.Client gói NuGet vào dự án của bạn. Nó chứa Microsoft Authentication Library (MSAL) được sử dụng để lấy token truy cập.

dotnet add package Microsoft.Identity.Client

Bước 3: Triển khai giao diện ITokenProvider

Tạo một GraphTokenProvider lớp thực hiện ITokenProvider giao diện. Lớp này sẽ sử dụng thư viện MSAL.NET để lấy token truy cập.

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

Bước 4: Tạo một instance ITokenProvider

Khi đã GraphTokenProvider lớp đã sẵn sàng, bạn có thể khởi tạo nó bằng thông tin đăng nhập ứng dụng của mình.

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

Bước 5: Khởi tạo IGraphClient

Sử dụng nhà cung cấp token để tạo một IGraphClient phiên bản. Đặt loại tài nguyên và ID để bắt đầu tương tác với Microsoft Graph.

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

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

IGraphClient của bạn hiện đã được xác thực và sẵn sàng gửi yêu cầu tới Microsoft Graph thay mặt cho ứng dụng của bạn.

Kết nối tới endpoint GCC High trong Microsoft Graph

Aspose.Email GraphClient hỗ trợ kết nối tới endpoint Microsoft Graph GCC High bằng cách thiết lập EndPoint thuộc tính một cách thủ công. Đặt thuộc tính thành https://graph.microsoft.us trước khi thực hiện các yêu cầu.

Đoạn mã mẫu sau đây minh họa cách cấu hình GraphClient để kết nối tới endpoint GCC High để liệt kê thư mục và lấy tin nhắn.

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

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

Xác thực bất đồng bộ tới Microsoft Graph

Sử dụng Aspose.Email.Clients.Graph.IGraphClientAsync giao diện để thực hiện các hoạt động bất đồng bộ với GraphClient. Thuộc tính GraphClient.GetClientAsync(ITokenProvider, string)GraphClient.GetClientAsync(IMultipleServicesTokenProvider, string) các phương pháp cho phép bạn khởi tạo các client Graph bất đồng bộ. Đoạn mã mẫu sau đây minh họa cách cấu hình một client Microsoft Graph đã xác thực bằng thông tin đăng nhập ứng dụng Azure AD để nó có thể hoạt động trên hộp thư của người dùng cụ thể:

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