You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用C#控制台通过Modern Authentication连接邮箱?(替代将禁用的Basic Auth)

切换Exchange邮箱连接至Modern Authentication实现方案

你当前使用Basic Auth的代码如下:

exchange = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
exchange.Credentials = new WebCredentials("Mail_box_username","Mail_box_password"); 
exchange.Url = new Uri("exchangeServer");
exchange.Url.Host;

由于Basic Auth将被禁用,以下是切换到Modern Authentication的具体实现步骤:

1. 前置准备

  • 安装必要的NuGet包:Microsoft.Identity.Client(用于获取OAuth令牌)、Microsoft.Exchange.WebServices(EWS核心库)
  • 在Azure AD中注册应用:
    • 获取客户端ID和租户ID
    • 配置API权限:添加Exchange Online的EWS.AccessAsUser.All委托权限(若为服务端应用,需添加应用权限),并完成管理员同意

2. 代码实现

根据应用类型选择对应实现方式:

桌面/交互式应用

using Microsoft.Identity.Client;
using Microsoft.Exchange.WebServices.Data;

// 配置参数
string clientId = "你的Azure AD应用客户端ID";
string tenantId = "租户ID(可填common、组织ID)";
string exchangeServerUrl = "https://outlook.office365.com/EWS/Exchange.asmx"; // Exchange Online地址,本地Exchange需确认对应地址
string mailboxAddress = "你的邮箱地址";

// 初始化MSAL客户端
var pca = PublicClientApplicationBuilder
    .Create(clientId)
    .WithTenantId(tenantId)
    .WithRedirectUri("http://localhost") // 桌面应用默认重定向URI
    .Build();

// 请求EWS权限范围
string[] scopes = new[] { "https://outlook.office365.com/EWS.AccessAsUser.All" };

// 获取OAuth访问令牌
var authResult = await pca.AcquireTokenInteractive(scopes).ExecuteAsync();

// 初始化ExchangeService(注意:Exchange2007_SP1不支持Modern Auth,需升级至Exchange2013_SP1及以上版本)
var exchange = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
exchange.Url = new Uri(exchangeServerUrl);
exchange.Credentials = new OAuthCredentials(authResult.AccessToken);
exchange.HttpHeaders.Add("X-AnchorMailbox", mailboxAddress); // 指定目标邮箱,可选但推荐

// 测试连接示例
var inbox = await Folder.Bind(exchange, WellKnownFolderName.Inbox);
Console.WriteLine($"连接成功,收件箱名称:{inbox.DisplayName}");

服务端/后台应用

若为无交互的后台服务,需使用客户端密钥或证书认证:

using Microsoft.Identity.Client;
using Microsoft.Exchange.WebServices.Data;

string clientId = "你的Azure AD应用客户端ID";
string tenantId = "组织ID";
string clientSecret = "你的应用客户端密钥";
string exchangeServerUrl = "https://outlook.office365.com/EWS/Exchange.asmx";
string mailboxAddress = "目标邮箱地址";

// 初始化MSAL机密客户端
var cca = ConfidentialClientApplicationBuilder
    .Create(clientId)
    .WithTenantId(tenantId)
    .WithClientSecret(clientSecret)
    .Build();

// 请求应用权限范围(需提前在Azure AD配置EWS应用权限)
string[] scopes = new[] { "https://outlook.office365.com/.default" };

// 获取令牌
var authResult = await cca.AcquireTokenForClient(scopes).ExecuteAsync();

// 初始化ExchangeService
var exchange = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
exchange.Url = new Uri(exchangeServerUrl);
exchange.Credentials = new OAuthCredentials(authResult.AccessToken);
exchange.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, mailboxAddress);

// 测试连接示例
var inbox = await Folder.Bind(exchange, WellKnownFolderName.Inbox);
Console.WriteLine($"连接成功,收件箱名称:{inbox.DisplayName}");

关键注意事项

  • Exchange版本要求:原代码使用的Exchange2007_SP1不支持Modern Authentication,需切换至Exchange2013_SP1及以上版本枚举
  • 权限配置:委托权限需用户或管理员同意,应用权限仅需管理员同意,根据应用场景选择
  • 令牌缓存:可实现MSAL的令牌缓存逻辑,避免重复获取令牌提升性能
  • 本地Exchange服务器:若连接本地Exchange,需确认服务器已启用Modern Authentication,并调整exchangeServerUrl为对应地址

内容的提问来源于stack exchange,提问作者Harendra Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:03:27