共用方式為


設定 Exchange 與 Exchange Online 組織之間的 OAuth 驗證

混合式設定精靈會自動設定 Exchange Server 內部部署與 Exchange Online 組織之間的 OAuth 驗證。 如果您的 Exchange 組織包含 Exchange 2010 或 Exchange 2007 伺服器,則混合式設定精靈不會在內部部署和在線 Exchange 組織之間設定 OAuth 驗證。 這些部署預設會繼續使用同盟信任程序。 不過,只有使用新的 Exchange OAuth 驗證通訊協定,才能在組織中完整使用某些功能。

新的 Exchange OAuth 驗證程序目前啟用下列 Exchange 功能:

  • MRM (訊息記錄管理)
  • Exchange 就地 eDiscovery
  • Exchange 就地封存

建議所有混合式 Exchange 2013 組織在執行混合式設定精靈之後,設定 Exchange OAuth 驗證。

重要事項

  • 如果您的內部部署組織只執行具有累積更新 5 或更新版本、Exchange 2016 或 Exchange 2019 的 Exchange 2013 伺服器,請執行混合式設定精靈,而不是執行本主題中的步驟。

  • 此 Exchange Server 2013 功能與中國的 21Vianet 所運作的 Office 365 不完全相容,部分功能可能受限。 如需詳細資訊,請參閱 由 21Vianet 營運的 Office 365

開始之前有哪些須知?

提示

有問題嗎? 在 Exchange 論壇中尋求協助。 瀏覽 Exchange Server 的論壇。

您要如何設定內部部署 Exchange 與 Exchange Online 組織之間的 OAuth 驗證?

詞彙

初始網域:租使用者中布建的第一個網域。 例如,contoso.onmicrosoft.com。 在本檔中,它稱為 <您的租使用者初始網域>

混合式路由網域:Exchange 混合式環境中的混合式路由網域,例如 contoso.mail.onmicrosoft.com,可用來管理內部部署 Exchange 伺服器與 Exchange Online 之間的郵件流程。 它可確保兩個環境之間的通訊和訊息傳遞順暢。 在本檔中,它稱為 <您的混合式路由網域>

Microsoft連線電子郵件路由位址 (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.svchttps://contoso.com/autodiscover/autodiscover.svc。 在本檔中,它稱為 <您的內部部署自動探索端點>

Exchange Web 服務 (EWS) :Exchange Web 服務 (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 Server 上執行 PowerShell 腳本,以導出內部部署授權憑證,然後在下一個步驟中匯入至您的 Exchange Online 組織。

  1. 將下列文字儲存到 PowerShell 指令碼檔案 (例如 ExportAuthCert.ps1)。

    注意事項

    如果您要上傳設定為未來成為新驗證憑證的憑證,請將 取代 $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 Access Control Service (ACS)

接下來,使用 Microsoft Graph PowerShell 上傳您在上一個步驟中導出的內部部署授權憑證,以Microsoft ACS) (Entra Access Control Services。 如果您未安裝模組,請以系統管理員身分開啟 Windows PowerShell 視窗,然後執行下列命令:

Install-Module -Name Microsoft.Graph.Applications

安裝 Microsoft Graph PowerShell 之後,請完成下列步驟。

  1. 開啟已安裝 Microsoft Graph Cmdlet 的 Windows PowerShell 工作區。 此步驟中的所有命令都會使用連線到 Microsoft Graph 控制台的 Windows PowerShell 來執行。

  2. 將下列文字儲存到 PowerShell 指令碼檔案 (例如 UploadAuthCert.ps1)。

    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. 將下列文字儲存到 PowerShell 指令碼檔案 (例如 RegisterEndpoints.ps1)。 將和 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.comcontoso.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 組織建立 IntraOrganizationConnector 至內部部署 Exchange 組織

在此步驟中,我們會設定 , 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 組織中,建議所有因特網對向前端伺服器都是執行 SP1 或更新版本的 Exchange 2013 用戶端存取伺服器。 所有 Exchange Web 服務 (EWS) 要求都必須通過 Exchange 2013 用戶端存取伺服器。 此需求包括從 Microsoft 365 到內部部署 Exchange 組織的要求,以及內部部署 Exchange 組織對 Microsoft 365 的要求。 請務必有足夠的 Exchange 2013 用戶端存取伺服器來處理處理負載,並提供連線備援。 您需要的用戶端存取伺服器數目取決於 EWS 要求的平均數量,並依組織而有所不同。

完成下列步驟之前,請確定:

  • 前端混合式伺服器是 Exchange 2013 SP1 或更新版本。
  • Exchange 2013 伺服器必須有唯一的外部 EWS URL。 Microsoft 365 或 Office 365 組織必須連線到這些伺服器,才能讓混合式功能的雲端式要求正確運作。
  • 伺服器同時具備 Mailbox 和 Client Access server role
  • 任何現有的 Exchange 2010/2007 Mailbox Server 和 Client Access Server 已套用最新的累計更新 (CU) 或 Service Pack (SP)。

注意事項

現有的 Exchange 2010/2007 Mailbox Server 可繼續使用 Exchange 2010/2007 Client Access Server 作為非混合式功能連線的前端伺服器。 只有來自 Microsoft 365 或 Office 365 組織的混合式部署功能要求需要連線到 Exchange 2013 伺服器。

AvailabilityAddressSpace必須在 Exchange 2013 之前的用戶端存取伺服器上設定 ,該伺服器指向內部部署 Exchange 2013 SP1 用戶端存取伺服器的 Exchange Web 服務端點, (的) 。 此端點與前面步驟 5 所述的端點相同,也可以在內部部署 Exchange 2013 SP1 Client Access Server 上執行下列指令程式來決定:

Get-WebServicesVirtualDirectory | Format-List AdminDisplayVersion,ExternalUrl

注意事項

如果從多部伺服器傳回虛擬目錄資訊,請確定您使用針對 Exchange 2013 SP1 Client Access Server 傳回的端點。 參數會顯示 15.0 (Build 847.32) 或更高 AdminDisplayVersion 版本。

若要設定 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. 。 參數必須 ResultTask 傳回的 Success值。 例如,測試輸出的最後一個區段應該會讀取:

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