现代身份验证 现在默认为所有新的 Microsoft 365/Azure 租户启用,因为此协议比已弃用的基本身份验证更安全。 现代身份验证基于 Active Directory 身份验证库和 OAuth 2.0。它使用有时间限制的令牌,并且应用程序不存储用户凭据。 此外,计划完全禁止对所有 Microsoft 365 客户端使用基本身份验证。 在本文中,我们将重点介绍使用现代身份验证通过 Aspose.Email for .NET 的 EWS、SMTP、IMAP、POP 客户端进行连接。

先决条件设置

要使用现代身份验证,请确保已启用它。但是,对于 2017 年 8 月 1 日之前创建的租户,现代身份验证默认处于关闭状态。 在 Microsoft 365 管理中心 中,转到设置 > 组织设置 > 现代身份验证。在出现的新式身份验证浮出控件中,您可以识别不再需要基本身份验证的协议。 对于 Azure 中的新 Microsoft365 租户,默认情况下对所有应用程序禁用基本身份验证。因此,文本将显示在此部分中。

Your organization has security defaults enabled, which means modern authentication to Exchange Online is required, and basic authentication connections are blocked.
You must turn off security defaults in the Azure portal before you can change any settings here.

您可以从 Azure 门户为租户启用基本身份验证支持,转到 Azure Active Directory > 属性 > 管理安全默认值 > 启用安全默认值 > No。 有关详细信息,请参阅 Microsoft 文档文章

使用 Azure Active Directory 注册应用程序

首先,需要向 Azure Active Directory 执行应用注册。 有两种类型的权限可用于通过您的应用访问邮箱。根据您正在创建的应用程序选择特定类型的权限:

  • 使用委派权限的应用程序有一个登录用户。换句话说,当您连接到该服务时,会出现一个对话框窗口以输入用户名和密码。应用程序永远不能拥有比登录用户更多的权限。
  • 使用应用程序权限的应用程序在没有登录用户的情况下运行。例如,这些是作为后台服务或守护程序运行的应用程序。只有管理员可以同意应用程序权限。

此外,有关详细信息,请参阅 Microsoft 文档文章

注册程序取决于选择的许可类型。要注册您的应用程序,请参阅 Microsoft 文档文章

用于访问电子邮件服务器的 C# .NET API

要创建 EWS、Imap 和 Smtp 客户端,我们将使用 Aspose.Email for .NET。这是一个使用 .NET 实现电子邮件客户端应用程序的惊人库。使用该库,您可以轻松连接和访问电子邮件服务器。您可以通过 NuGet下载 它的 DLL 安装 Aspose.Email for .NET。

PM> Install-Package Aspose.Email

通过 EwsClient 使用现代身份验证

注册应用程序后,我们可以专注于编写代码,代码将由以下部分组成:

  • 首先,获取授权令牌。
  • 然后,使用令牌进行身份验证。

获取授权令牌

要获取令牌,我们将使用 Microsoft Authentication Library (MSAL) for .NET

以下是在 C# 中获取授权令牌的步骤。

  • 添加包含 MSAL.NET 二进制文件的 Microsoft.Identity.Client nuget 包
  • 创建一个 AccessParameters 类来存储凭据。
  • 最后,创建一个接受访问参数并使用 MSAL.NET 获取访问令牌的方法。

以下代码示例将取决于选择的身份验证类型。

获取具有委托身份验证的令牌

public class AccessParameters
{
    public string TenantId { get; set; }
    public string ClientId { get; set; }
    public string RedirectUri { get; set; } = "http://localhost";
    public string[] Scopes { get; set; } = { "https://outlook.office365.com/EWS.AccessAsUser.All" };
}

public static async Task<string> GetAccessToken(AccessParameters accessParameters)
{
    var pca = PublicClientApplicationBuilder
                            .Create(accessParameters.ClientId)
                            .WithTenantId(accessParameters.TenantId)
                            .WithRedirectUri(ccessParameters.RedirectUri)
                            .Build();

    var result = await pca.AcquireTokenInteractive(accessParameters.Scopes)
        .WithUseEmbeddedWebView(false)
        .ExecuteAsync();

    return result.AccessToken;
}

使用应用身份验证获取令牌

public class AccessParameters
{
    public string TenantId { get; set; }
    public string ClientId { get; set; }
    public string ClientSecret { get; set; }
    public string[] Scopes { get; set; } = { "https://outlook.office365.com/.default" };
}

public static async Task<string> GetAccessToken(AccessParameters accessParameters)
{
    var cca = ConfidentialClientApplicationBuilder
        .Create(accessParameters.ClientId)
        .WithClientSecret(accessParameters.ClientSecret)
        .WithTenantId(accessParameters.TenantId)
        .Build();

    var result = await cca.AcquireTokenForClient(accessParameters.Scopes).ExecuteAsync();

    return result.AccessToken;
}

使用令牌进行身份验证

之后,当我们成功获得令牌后,让我们初始化 EwsClient

将令牌与委托身份验证一起使用

NetworkCredential credentials = new OAuthNetworkCredential(accessToken);

using var client = EWSClient.GetEWSClient("https://outlook.office365.com/EWS/Exchange.asmx", credentials);

将令牌与应用身份验证一起使用

// 使用 Microsoft365 用户名和访问令牌
NetworkCredential credentials = new OAuthNetworkCredential(username, accessToken);

using var client = EWSClient.GetEWSClient("https://outlook.office365.com/EWS/Exchange.asmx", credentials);

对 IMAP、POP 或 SMTP 客户端使用现代身份验证

不支持通过应用程序权限访问 IMAP、POP、SMTP。换句话说,仅支持委托身份验证。

使用 Azure Active Directory 注册应用程序的过程定义为 以上

使用 Microsoft 365 管理中心在特定邮箱上启用或禁用 IMAP、POP、SMTP AUTH

  • 打开 Microsoft 365 管理中心 并转到用户 > 活动用户。
  • 选择用户,然后在出现的浮出控件中单击邮件。
  • 在电子邮件应用程序部分,单击管理电子邮件应用程序。
  • 验证 IMAP、POP、Authenticated SMTP 设置:未选中 = 禁用,选中 = 启用。
  • 最后,单击保存更改。

添加代码以从令牌服务器获取身份验证令牌

确保指定完整范围,包括 Outlook 资源 URL。

  • IMAP:https://outlook.office.com/IMAP.AccessAsUser.All
  • POP:https://outlook.office.com/POP.AccessAsUser.All
  • SMTP:https://outlook.office.com/SMTP.Send

要获取令牌,我们将使用 Microsoft Authentication Library (MSAL) for .NET

以下是在 C# 中获取授权令牌的步骤。

  • 添加包含 MSAL.NET 二进制文件的 Microsoft.Identity.Client nuget 包
  • 创建一个 AccessParameters 类来存储凭据。
  • 最后,创建一个接受访问参数并使用 MSAL.NET 获取访问令牌的方法。
public class AccessParameters
{
    public string TenantId { get; set; }
    public string ClientId { get; set; }
    public string RedirectUri { get; set; } = "http://localhost";
    public string[] Scopes { get; set; } = { 
        "https://outlook.office.com/IMAP.AccessAsUser.All", 
        "https://outlook.office.com/SMTP.Send" };
}

public static async Task<string> GetAccessToken(AccessParameters accessParameters)
{
    var pca = PublicClientApplicationBuilder
                            .Create(accessParameters.ClientId)
                            .WithTenantId(accessParameters.TenantId)
                            .WithRedirectUri(ccessParameters.RedirectUri)
                            .Build();

    var result = await pca.AcquireTokenInteractive(accessParameters.Scopes)
        .WithUseEmbeddedWebView(false)
        .ExecuteAsync();

    return result.AccessToken;
}

使用令牌进行身份验证

之后,当我们成功获取到token后,让我们初始化ImapClient

var imapClient = new ImapClient(
    "outlook.office365.com", 
    993, 
    username, 
    accessToken, 
    true);

同样,SmtpClient 初始化将如下所示。

var smtpClient = new SmtpClient(
    "smtp.office365.com",
    587, 
    username,
    accessToken, 
    true);

获取免费 API 许可证

您可以使用 免费临时许可证 使用 Aspose.Email for .NET,而不受评估限制。

结论

在本文中,您学习了如何使用 Aspose.Email API 的现代身份验证来连接到 Microsoft365 邮箱。此外,您已经看到可以轻松创建满足高级安全要求的电子邮件客户端应用程序。您可以使用 文档 了解有关 Aspose.Email 的更多信息。如果您有任何问题,您可以在我们的 论坛 上发帖。

也可以看看