如何使用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
相关产品推荐
相关产品推荐

