随着微软持续推进其云生态系统的现代化,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) 获取访问令牌。典型的迁移流程包括:

  1. 在Azure门户注册应用:设置重定向URI,并授予Mail.Read、Mail.Send等API权限。
  2. 安装MSAL NuGet包:在VB.NET项目中引入Microsoft.Identity.Client
  3. 使用设备代码流或客户端凭据流获取Token(根据应用类型选择)。
  4. 调用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.ReadMail.Send)。开发者需仔细梳理应用功能,对应申请合适的作用域。
  • 分页与性能:MS Graph默认每页返回10条消息,需处理@odata.nextLink以实现完整分页。VB.NET中建议使用Microsoft.Graph SDK简化操作。
  • 错误处理: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的迁移指南以及示例代码,建议开发者尽早启动评估和改造工作。