在 Exchange 和 Exchange Online 组织之间配置 OAuth 身份验证

混合配置向导会自动在本地 Exchange Server 与 Exchange Online 组织之间配置 OAuth 身份验证。 如果 Exchange 组织包含 Exchange 2010 或 Exchange 2007 服务器,则混合配置向导不会在本地和联机 Exchange 组织之间配置 OAuth 身份验证。 默认情况下,这些部署继续使用联合身份验证信任过程。 但是,某些功能仅通过使用新的 Exchange OAuth 身份验证协议在组织中完全可用。

新的 Exchange OAuth 身份验证过程当前支持以下 Exchange 功能:

  • 邮件记录管理 (MRM)
  • Exchange 就地电子数据展示
  • Exchange 就地存档

建议所有混合 Exchange 2013 组织在运行混合配置向导后配置 Exchange OAuth 身份验证。

重要

  • 如果本地组织仅运行具有累积更新 5 或更高版本的 Exchange 2013 服务器、Exchange 2016 或 Exchange 2019,请运行混合配置向导,而不是执行本主题中的步骤。

  • Exchange Server 2013 的此项功能与由世纪互联在中国运营的 Office 365 不完全兼容,可能需要遵循一些功能限制。 有关详细信息,请参阅 由世纪互联运营的 Office 365

开始前,有必要了解什么?

提示

是否有任何疑问? 在 Exchange 论坛中寻求帮助。 访问 Exchange Server 上的论坛。

如何在本地 Exchange 和 Exchange Online 组织之间配置 OAuth 身份验证?

术语表

初始域:租户中预配的第一个域。 例如,contoso.onmicrosoft.com。 本文档中称为 <租户初始域>

混合路由域:Exchange 混合环境中的混合路由域(如 contoso.mail.onmicrosoft.com)用于管理本地 Exchange 服务器与 Exchange Online 之间的邮件流。 它确保跨两个环境无缝通信和消息传递。 本文档中称为 <混合路由域>

Microsoft Online Email Routing Address (MOERA) :根据用户的前缀构造的 userPrincipalName 地址,加上初始域后缀,该地址会自动添加到 proxyAddress Microsoft Entra ID 中的 。 例如,smtp:john.doe@contoso.onmicrosoft.com。 我们在此文档中不使用 , MOERA 但为了完整起见,请在此处列出它。

主 SMTP 域:Microsoft Exchange Server 中的主 SMTP 域是用于组织内电子邮件地址的主域。 在本文档中,它称为 <主 SMTP 域>

自动发现终结点:自动发现终结点是提供 Exchange Server 配置信息的 Web 服务 URL。 它使应用程序能够自动发现并连接到 Exchange 服务。 例如 contoso.com ,如果公司使用 作为主 SMTP 域,则自动发现终结点通常 https://autodiscover.contoso.com/autodiscover/autodiscover.svc 为 或 https://contoso.com/autodiscover/autodiscover.svc。 本文档中称为 <本地自动发现终结点>

Exchange Web Services (EWS) :Exchange Web Services (EWS) 是一种跨平台 API,使应用程序能够访问邮箱项目(如电子邮件、会议和联系人)。 本文档中称为 <本地外部 Exchange Web 服务 URL>

步骤 1:为 Exchange Online 组织创建授权服务器对象

在本地 Exchange 组织中的 Exchange 命令行管理程序中运行以下命令, (Exchange PowerShell) 。 在运行 命令之前,请确保将占位符替换为值:

New-AuthServer -Name "WindowsAzureACS" -AuthMetadataUrl "https://accounts.accesscontrol.windows.net/<your tenant initial domain>/metadata/json/1"
New-AuthServer -Name "evoSTS" -Type AzureAD -AuthMetadataUrl "https://login.windows.net/<your tenant initial domain>/federationmetadata/2007-06/federationmetadata.xml"

在 GCC High 或 DoD 中,需要改用以下命令:

New-AuthServer -Name "WindowsAzureACS" -AuthMetadataUrl "https://login.microsoftonline.us/<your tenant initial domain>/metadata/json/1"
New-AuthServer -Name "evoSTS" -Type AzureAD -AuthMetadataUrl "https://login.microsoftonline.us/<your tenant initial domain>/federationmetadata/2007-06/federationmetadata.xml"

步骤 2:为 Exchange Online 组织启用合作伙伴申请

在本地 Exchange 组织的 Exchange PowerShell 中运行以下命令:

Get-PartnerApplication |  Where-Object {$_.ApplicationIdentifier -eq "00000002-0000-0ff1-ce00-000000000000" -and $_.Realm -eq ""} | Set-PartnerApplication -Enabled $true

步骤 3:导出本地授权证书

在此步骤中,必须在 Exchange 服务器上直接运行 PowerShell 脚本,以导出本地授权证书,然后在下一步中将证书导入到 Exchange Online 组织。

  1. 将以下文本保存到名为 ExportAuthCert.ps1(示例名称)的 PowerShell 脚本文件中。

    注意

    如果要上传配置为将来成为新的身份验证证书的证书,请将 替换为 $thumbprint = (Get-AuthConfig).CurrentCertificateThumbprint$thumbprint = (Get-AuthConfig).NewCertificateThumbprint

    $thumbprint = (Get-AuthConfig).CurrentCertificateThumbprint
    if((Test-Path $env:SYSTEMDRIVE\OAuthConfig) -eq $false)
    {
       New-Item -Path $env:SYSTEMDRIVE\OAuthConfig -Type Directory
    }
    Set-Location -Path $env:SYSTEMDRIVE\OAuthConfig
    $oAuthCert = (dir Cert:\LocalMachine\My) | Where-Object {$_.Thumbprint -match $thumbprint}
    $certType = [System.Security.Cryptography.X509Certificates.X509ContentType]::Cert
    $certBytes = $oAuthCert.Export($certType)
    $CertFile = "$env:SYSTEMDRIVE\OAuthConfig\OAuthCert.cer"
    [System.IO.File]::WriteAllBytes($CertFile, $certBytes)
    
  2. 在本地 Exchange 组织的 Exchange PowerShell 中,运行您在上一步骤中创建的 PowerShell 脚本。 例如:

    .\ExportAuthCert.ps1
    

步骤 4:将本地授权证书上传到 Microsoft Entra 访问控制服务 (ACS)

接下来,使用 Microsoft Graph PowerShell 上传在上一步中导出的本地授权证书,以Microsoft Entra Access Control Services (ACS) 。 如果未安装模块,请以管理员身份打开 Windows PowerShell 窗口,并运行以下命令:

Install-Module -Name Microsoft.Graph.Applications

安装 Microsoft Graph PowerShell 后完成以下步骤。

  1. 打开安装了 Microsoft Graph cmdlet 的 Windows PowerShell 工作区。 此步骤中的所有命令都将使用连接到 Microsoft Graph 控制台的 Windows PowerShell 运行。

  2. 将以下文本保存到名为 UploadAuthCert.ps1(示例名称)的 PowerShell 脚本文件中。

    Connect-MgGraph -Scopes Application.ReadWrite.All
    
    $CertFile = "$env:SYSTEMDRIVE\OAuthConfig\OAuthCert.cer"
    $objFSO = New-Object -ComObject Scripting.FileSystemObject
    $CertFile = $objFSO.GetAbsolutePathName($CertFile)
    $cer = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($CertFile)
    $binCert = $cer.GetRawCertData()
    $credValue = [System.Convert]::ToBase64String($binCert)
    $ServiceName = "00000002-0000-0ff1-ce00-000000000000"
    Write-Host "[+] Trying to query the service principals for service: $ServiceName" -ForegroundColor Cyan
    $p = Get-MgServicePrincipal -Filter "AppId eq '$ServiceName'"
    Write-Host "[+] Trying to query the keyCredentials for service: $ServiceName" -ForegroundColor Cyan
    $servicePrincipalKeyInformation = Get-MgServicePrincipal -Filter "AppId eq '$ServiceName'" -Select "keyCredentials"
    
    $keyCredentialsLength = $servicePrincipalKeyInformation.KeyCredentials.Length
    if ($keyCredentialsLength -gt 0) {
       Write-Host "[+] $keyCredentialsLength existing key(s) found - we keep them if they have not expired" -ForegroundColor Cyan
    
       $newCertAlreadyExists = $false
       $servicePrincipalObj = New-Object -TypeName Microsoft.Graph.PowerShell.Models.MicrosoftGraphServicePrincipal
       $keyCredentialsArray = @()
    
       foreach ($cred in $servicePrincipalKeyInformation.KeyCredentials) {
          $thumbprint = [System.Convert]::ToBase64String($cred.CustomKeyIdentifier)
    
          Write-Host "[+] Processing existing key: $($cred.DisplayName) thumbprint: $thumbprint" -ForegroundColor Cyan
    
          if ($newCertAlreadyExists -ne $true) {
             $newCertAlreadyExists = ($cer.Thumbprint).Equals($thumbprint, [System.StringComparison]::OrdinalIgnoreCase)
          }
    
          if ($cred.EndDateTime -lt (Get-Date)) {
             Write-Host "[+] This key has expired on $($cred.EndDateTime) and will not be retained" -ForegroundColor Yellow
             continue
          }
    
          $keyCredential = New-Object -TypeName Microsoft.Graph.PowerShell.Models.MicrosoftGraphKeyCredential
          $keyCredential.Type = "AsymmetricX509Cert"
          $keyCredential.Usage = "Verify"
          $keyCredential.Key = $cred.Key
    
          $keyCredentialsArray += $keyCredential
       }
    
    
       if ($newCertAlreadyExists -eq $false) {
          Write-Host "[+] New key: $($cer.Subject) thumbprint: $($cer.Thumbprint) will be added" -ForegroundColor Cyan
          $keyCredential = New-Object -TypeName Microsoft.Graph.PowerShell.Models.MicrosoftGraphKeyCredential
          $keyCredential.Type = "AsymmetricX509Cert"
          $keyCredential.Usage = "Verify"
          $keyCredential.Key = [System.Text.Encoding]::ASCII.GetBytes($credValue)
    
          $keyCredentialsArray += $keyCredential
    
          $servicePrincipalObj.KeyCredentials = $keyCredentialsArray
          Update-MgServicePrincipal -ServicePrincipalId $p.Id -BodyParameter $servicePrincipalObj
       } else {
          Write-Host "[+] New key: $($cer.Subject) thumbprint: $($cer.Thumbprint) already exists and will not be uploaded again" -ForegroundColor Yellow
       }
    } else {
       $params = @{
          type = "AsymmetricX509Cert"
          usage = "Verify"
          key = [System.Text.Encoding]::ASCII.GetBytes($credValue)
       }
    
       Write-Host "[+] This is the first key which will be added to this service principal" -ForegroundColor Cyan
       Update-MgServicePrincipal -ServicePrincipalId $p.Id -KeyCredentials $params
    }
    
  3. 运行您在上一步骤中创建的 PowerShell 脚本。 例如:

    .\UploadAuthCert.ps1
    
  4. 启动脚本后,您会看到凭据对话框。 输入 Microsoft Online Microsoft Entra 组织中的租户管理员帐户的凭据。 运行脚本后,将 Windows PowerShell 连接到 Microsoft Graph 会话保持打开状态。 您将在下一步骤中使用此程序运行 PowerShell 脚本。

步骤 5:使用 Microsoft Entra ID 注册内部和外部本地 Exchange HTTP 终结点的所有主机名颁发机构

需要在此步骤中为本地 Exchange 组织中每个可公开访问的终结点运行脚本,包括混合新式身份验证) 的内部和外部 URL。 例如,如果 Exchange 在 https://mail.contoso.com/ews/exchange.asmx外部可用,请使用服务主体名称 https://mail.contoso.com。 注册其他外部主机名颁发机构并无限制。

若要确认本地组织中的 Exchange 终结点,请在 Exchange 命令行管理程序中运行以下命令:

Get-MapiVirtualDirectory | Format-List server,*url*
Get-WebServicesVirtualDirectory | Format-List server,*url*
Get-OABVirtualDirectory | Format-List server,*url*

注意

以下脚本要求连接到 Microsoft Graph 的 Windows PowerShell 连接到 Microsoft 365 组织,如上一部分中的步骤 4 中所述。

  1. 将以下文本保存到名为 RegisterEndpoints.ps1(示例名称)的 PowerShell 脚本文件中。 将 和 https://autodiscover.contoso.com/ 替换为https://mail.contoso.com/本地 Exchange 组织的相应主机名颁发机构。

     $ServiceName = "00000002-0000-0ff1-ce00-000000000000";
     $x = Get-MgServicePrincipal -Filter "AppId eq '$ServiceName'"
     $x.ServicePrincipalNames += "https://mail.contoso.com/"
     $x.ServicePrincipalNames += "https://autodiscover.contoso.com/"
     Update-MgServicePrincipal -ServicePrincipalId $x.Id -ServicePrincipalNames $x.ServicePrincipalNames
    
  2. 在连接到 Microsoft Graph 的 Windows PowerShell 中,运行在上一步中创建的 Windows PowerShell 脚本。 例如:

    .\RegisterEndpoints.ps1
    
  3. 若要验证是否已添加所有记录,请在连接到 Microsoft Graph 的 Windows PowerShell 中运行以下命令,并在结果中查找 https://namespace 条目。

    Get-MgServicePrincipal -Filter "AppId eq '$ServiceName'" | Select-Object -ExpandProperty ServicePrincipalNames | Sort-Object
    

步骤 6:从本地组织创建 IntraOrganizationConnector,以Microsoft 365 或 Office 365

在此步骤中,我们将配置 允许 IntraOrganizationConnector 本地 Exchange Server 访问 Exchange Online 组织。 此连接器可跨组织实现功能可用性和服务连接。 可以在本地和 Microsoft 365 或 Office 365 租户中使用 Get-IntraOrganizationConfiguration cmdlet 来确定 New-IntraOrganizationConnector cmdlet 所需的终结点值。

我们将混合路由域配置为目标地址。 创建 Microsoft 365 或 Office 365 组织时,会自动创建混合路由域。 例如,如果在 Microsoft 365 或 Office 365 组织中添加和验证的第一个域是 contoso.com,则目标地址将是 contoso.mail.onmicrosoft.com

使用 Exchange PowerShell 在本地组织中运行以下 cmdlet:

$ServiceDomain = (Get-AcceptedDomain | Where-Object {$_.DomainName -like "*.mail.onmicrosoft.com"}).DomainName.Address
New-IntraOrganizationConnector -Name ExchangeHybridOnPremisesToOnline -DiscoveryEndpoint https://outlook.office365.com/autodiscover/autodiscover.svc -TargetAddressDomains $ServiceDomain

步骤 7:从 Microsoft 365 或 Office 365 组织到本地 Exchange 组织创建 IntraOrganizationConnector

在此步骤中,我们将配置允许 IntraOrganizationConnector Exchange Online 访问本地 Exchange 组织的 。 此连接器可跨组织实现功能可用性和服务连接。 可以在本地和 Microsoft 365 或 Office 365 租户中使用 Get-IntraOrganizationConfiguration cmdlet 来确定 New-IntraOrganizationConnector cmdlet 所需的终结点值。

应添加 Exchange 本地组织中使用的所有 SMTP 域 (,但你的 initial domainhybrid routing domain) 为 TargetAddressDomains除外。 如果有多个 SMTP 域,请将其添加为逗号分隔列表, (例如 、 contoso.comtailspintoys.com) 。 还需要将本地自动发现终结点作为 DiscoveryEndpoint提供。

连接到 Exchange Online PowerShell 后,将 和 <your on-premises SMTP domain(s)> 替换为<your on-premises AutoDiscover endpoint>值并运行以下命令:

New-IntraOrganizationConnector -Name ExchangeHybridOnlineToOnPremises -DiscoveryEndpoint <your on-premises AutoDiscover endpoint> -TargetAddressDomains <your on-premises SMTP domain(s)>

步骤 8:为任何 Exchange 2013 SP1 之前的服务器配置 AvailabilityAddressSpace。

警告

Exchange Server 2007、Exchange Server 2010 和 Exchange Server 2013 已终止支持。

在较旧的 Exchange 组织中配置混合部署时,至少需要一台运行 Exchange 2013 SP1 或更高版本的 Exchange 2013 服务器。 Exchange 2013 服务器需要客户端访问和邮箱服务器角色。 Exchange 2013 服务器协调现有 Exchange 本地组织和 Exchange Online 组织之间的通信。 我们强烈建议在内部部署组织中安装多个 Exchange 2013 服务器,以帮助提高混合部署功能的可靠性和可用性。

在具有 Exchange 2010 或 Exchange 2007 的 Exchange 2013 组织中,我们建议所有面向 Internet 的前端服务器都是运行 SP1 或更高版本的 Exchange 2013 客户端访问服务器。 所有 Exchange Web Services (EWS) 请求都必须通过 Exchange 2013 客户端访问服务器。 此要求包括从 Microsoft 365 向本地 Exchange 组织发出的请求,以及本地 Exchange 组织向 Microsoft 365 发出的请求。 请务必拥有足够的 Exchange 2013 客户端访问服务器来处理处理负载并提供连接冗余。 所需的客户端访问服务器数取决于平均 EWS 请求量,并因组织而异。

完成下面的步骤之前,请确保:

  • 前端混合服务器是 Exchange 2013 SP1 或更高版本。
  • 您对 Exchange 2013 服务器具有唯一的外部 EWS URL。 Microsoft 365 或 Office 365 组织必须连接到这些服务器,以便基于云的混合功能请求正常工作。
  • 服务器具有邮箱服务器和客户端访问服务器角色
  • 任何现有的 Exchange 2010/2007 邮箱服务器和客户端访问服务器都应用了最新的累积更新 (CU) 或 Service Pack (SP)。

注意

现有的 Exchange 2010/2007 邮箱服务器可以继续使用 Exchange 2010/2007 客户端访问服务器,作为非混合功能连接的前端服务器。 只有来自 Microsoft 365 或 Office 365 组织的混合部署功能请求需要连接到 Exchange 2013 服务器。

AvailabilityAddressSpace必须在 Exchange 2013 之前的客户端访问服务器上配置 ,该服务器指向本地 Exchange 2013 SP1 客户端访问服务器的 Exchange Web 服务终结点 () 。 此终结点是步骤 5 之前介绍的同一个终结点,您也可以通过在本地 Exchange 2013 SP1 客户端访问服务器上运行以下 cmdlet 来确定此终结点:

Get-WebServicesVirtualDirectory | Format-List AdminDisplayVersion,ExternalUrl

注意

如果从多个服务器返回虚拟目录信息,请确保使用为 Exchange 2013 SP1 客户端访问服务器返回的终结点。 它将为 AdminDisplayVersion 参数显示15.0 (Build 847.32)或更高版本。

若要配置 AvailabilityAddressSpace,请使用 Exchange PowerShell 并在本地组织中运行以下 cmdlet:

Add-AvailabilityAddressSpace -AccessMethod InternalProxy -ProxyUrl <your on-premises external Exchange Web Services URL> -ForestName <your hybrid routing domain> -UseServiceAccount $true

如何知道操作成功?

您可以使用 Test-OAuthConnectivity cmdlet 验证 OAuth 配置是否正确。 此 cmdlet 验证本地 Exchange 和 Exchange Online 终结点是否可以成功对彼此发出的请求进行身份验证。

若要验证您的本地 Exchange 组织能否成功连接到 Exchange Online,请在本地组织的 Exchange PowerShell 中运行以下命令:

Test-OAuthConnectivity -Service EWS -TargetUri https://outlook.office365.com/ews/exchange.asmx -Mailbox <On-Premises Mailbox> -Verbose | Format-List

若要验证 Exchange Online 组织是否可以成功连接到本地 Exchange 组织, 请连接到 Exchange Online PowerShell 并运行以下命令:

Test-OAuthConnectivity -Service EWS -TargetUri <external hostname authority of your Exchange On-Premises deployment>/metadata/json/1 -Mailbox <Exchange Online Mailbox> -Verbose | Format-List

示例:

Test-OAuthConnectivity -Service EWS -TargetUri `https://mail.contoso.com/metadata/json/1` -Mailbox ExchangeOnlineBox1 -Verbose | Format-List

重要

可以忽略此错误 The SMTP address has no mailbox associated with it. 。 只有参数返回 值Success才很重要ResultTask。 例如,测试输出的最后一部分应显示:

ResultType: Success
Identity: Microsoft.Exchange.Security.OAuth.ValidationResultNodeId
IsValid: True
ObjectState: New