随着微软持续推进其云生态系统的现代化,Exchange Web Services(EWS)的基本认证已于2020年10月正式退役,而基于OAuth的MS Graph逐渐成为访问Exchange数据和Office 365资源的主流方式。对于仍在使用VB.NET开发Exchange集成应用的开发者而言,从EWS认证迁移到MS Graph认证已不再是“可选项”,而是必须完成的技术升级。
一、背景:为什么必须迁移?
EWS自2007年起为开发者提供了直接操作Exchange邮箱、日历、联系人等功能的接口,但其基本认证方式——即通过用户名和密码明文传输——存在严重的安全隐患。微软从2020年起陆续关闭了Exchange Online中的基本认证,并强烈建议所有应用采用现代身份验证(OAuth 2.0)。与此同时,MS Graph作为微软统一API网关,不仅覆盖了EWS的全部核心功能(如邮件发送、日历查询、联系人管理),还整合了Teams、SharePoint、OneDrive等更多服务。
对于使用VB.NET开发的遗留应用,如果仍依赖EWS的基本认证调用Exchange Online,这些功能将直接失效。迁移至MS Graph并使用OAuth认证,已成为保障业务连续性的唯一选择。
二、迁移的核心变化:从Basic Auth到OAuth 2.0
在EWS时代,VB.NET代码通常这样编写:
Dim service As New ExchangeService(ExchangeVersion.Exchange2013_SP1)
service.Credentials = New WebCredentials("user@domain.com", "password")
service.Url = New Uri("https://outlook.office365.com/EWS/Exchange.asmx")
而在MS Graph中,开发者需要先通过Azure AD注册应用,获取客户端ID和机密,然后使用Microsoft Authentication Library (MSAL) 获取访问令牌。典型的迁移流程包括:
- 在Azure门户注册应用:设置重定向URI,并授予Mail.Read、Mail.Send等API权限。
- 安装MSAL NuGet包:在VB.NET项目中引入
Microsoft.Identity.Client。 - 使用设备代码流或客户端凭据流获取Token(根据应用类型选择)。
- 调用Graph API:通过HTTP请求(如使用HttpClient)访问
https://graph.microsoft.com/v1.0/me/messages。
三、VB.NET中的关键代码示例
以下是一个简化但完整的VB.NET代码片段,演示如何通过MS Graph获取用户收件箱邮件:
Imports Microsoft.Identity.Client
Imports System.Net.Http
Imports System.Net.Http.Headers
Public Async Function GetInboxEmailsAsync(clientId As String, tenantId As String) As Task(Of String)
Dim app As IPublicClientApplication = PublicClientApplicationBuilder.Create(clientId)
.WithAuthority($"https://login.microsoftonline.com/{tenantId}")
.WithDefaultRedirectUri()
.Build()
Dim accounts = Await app.GetAccountsAsync()
Dim result As AuthenticationResult
result = Await app.AcquireTokenSilent({"Mail.Read"}, accounts.FirstOrDefault())
.ExecuteAsync()
' 若静默获取失败,可降级到交互式获取
If result Is Nothing Then
result = Await app.AcquireTokenInteractive({"Mail.Read"})
.ExecuteAsync()
End If
Using client As New HttpClient()
client.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", result.AccessToken)
Dim response = Await client.GetAsync("https://graph.microsoft.com/v1.0/me/messages")
Return Await response.Content.ReadAsStringAsync()
End Using
End Function
值得注意:如果应用为后台服务(无用户交互),应使用客户端凭据流,需在Azure AD中注册机密证书或客户端机密,并授予应用程序权限。
四、迁移注意事项与最佳实践
- 权限差异:EWS通常以邮箱全量访问权限为主,而MS Graph采用最小权限原则(如仅
Mail.Read、Mail.Send)。开发者需仔细梳理应用功能,对应申请合适的作用域。 - 分页与性能:MS Graph默认每页返回10条消息,需处理
@odata.nextLink以实现完整分页。VB.NET中建议使用Microsoft.GraphSDK简化操作。 - 错误处理:OAuth令牌有效期为60分钟,需实现令牌刷新逻辑。同时注意HTTP 429节流限制,退避策略不可或缺。
- 旧代码兼容:若仍需支持本地Exchange Server(2013/2016/2019),EWS仍可使用OAuth认证,但MS Graph不支持本地部署。混合场景建议分步迁移。
五、行业影响与展望
据GitHub社区统计,截至2025年初,仍有超过12%的Exchange集成项目使用EWS,其中不少为VB.NET编写的企业内部工具。迁移至MS Graph不仅解决了安全合规问题,还解锁了跨服务数据整合能力——例如同时读取邮件和Teams消息。微软已承诺将持续增强MS Graph对Exchange功能的覆盖率,未来连“公用文件夹”也会纳入其中。
对于VB.NET开发者而言,此次迁移是拥抱现代认证体系的关键一步。虽然代码重构工作量不可忽视,但长远来看,统一的API层和OAuth生态将极大降低维护成本,让旧应用重新跟上云时代的节奏。微软官方也提供了EWS到MS Graph的迁移指南以及示例代码,建议开发者尽早启动评估和改造工作。