配置基于服务器端同步的身份验证
①Dynamics 发出同步请求 → ②③先去 Azure AD,用 Entra ID App 的身份拿到 Exchange Online 的 OAuth 令牌 → ④拿令牌调用 Exchange Web Services → 完成邮件/日历/任务的收发与同步。
一句话总结,通过Entra ID App让 Azure AD 认可 Dynamics op版的身份,从而允许它访问 Exchange Online
# 0. 前提
Dynamics CRM的op服务器使用Graph Powershell(微软已于2024.3.31弃用了MSOnline PowerShell模块)
# 1. 生成并安装证书
# 1.1 生成证书
生成证书后会得到下列参数,在后续步骤3.1中使用:
$privateKeyPassword
- 证书私钥的密码(
SecureString
类型)。
$pfxFilePath
- PFX 文件路径(包含证书和私钥的文件)。
# 1.2 安装证书
目的:把 PFX 证书导入到服务器证书存储 + 给 CRM 异步服务账号授予私钥读取权限 + 在 CRM 配置数据库里登记这个证书(类型为 S2STokenIssuer
)
以管理员身份,在运行部署工具服务器角色的 Microsoft Dynamics 365 Server 上,启动适用于 Windows PowerShell 的 Azure Active Directory 模块。
- **目的:**用于后续3.1运行的
ConfigureCrmServerSideSync.ps1
脚本中和AAD通信
- **目的:**用于后续3.1运行的
将PowerShell当前目录更改为
CertificateReconfiguration.ps1
文件所在的位置(默认为 C:\Program Files\Microsoft Dynamics CRM\Tools)。cd "C:\Program Files\Microsoft Dynamics CRM\Tools"
1替换下面命令中的:
(1)certificateFile 为【PFX 证书文件的完整路径】;
(2)personal_certfile_password为【导出 PFX 时设置的私钥密码】;
(3)contoso\CRMAsyncService为【运行 Dynamics 365 异步处理服务(Async Service)的域账号】
$CertificateScriptWithCommand = ".\CertificateReconfiguration.ps1 -certificateFile c:\Personalcertfile.pfx -password personal_certfile_password -updateCrm -certificateType S2STokenIssuer -serviceAccount contoso\CRMAsyncService -storeFindType FindBySubjectDistinguishedName" Invoke-Expression -command $CertificateScriptWithCommand
1
2
# 2. 注册应用程序
用于 Dynamics 与 Exchange Online 之间的通信。注册应用程序会在应用与Microsoft 标识平台之间建立信任关系。 信任是单向的:你的应用信任Microsoft 标识平台,而不是相反。 创建后,应用程序对象不能在不同的租户之间移动。
注意:注册应用程序需要用和1中远程登录crm服务器安装证书的同一个身份。
# 2.1 注册应用程序
- 路径:Azure Portal > Microsoft Entra ID > App registrations > New registration
# 2.2 配置平台设置
目的:输入应用的 重定向 URI 。 此 URI 是 Microsoft 标识平台重定向用户客户端并在身份验证后发送安全令牌的位置。
路径:注册完成后,Microsoft Entra 管理中心将显示应用注册的“概述”窗格。在该页面的Manage > Authentication(Preview)中,点击Add Redirect URI
# 2.3 添加凭据
- 目的:凭据由访问 Web API 的 机密客户端应用程序 (opens new window) 使用。 机密客户端的示例包括 Web 应用、其他 Web API 或服务类型和守护程序类型应用程序。 凭据允许应用程序以自身身份进行身份验证,无需用户在运行时进行交互。
- 路径:该页面的Manage > Certificates&secrets > New client secret
- 客户端机密生存期限制为两年 (24 个月) 或更短。 不能指定超过 24 个月的自定义生存期。
- Microsoft建议将过期值设置为小于 12 个月。
- 记录要在 客户端应用程序代码中使用的机密值。 离开此页面后 ,永远不会再次显示 此机密值。
# 2.4 向新应用添加并授予以下API权限
Application.ReadWrite.All、Orgaization.Read.All、User.Read
- 目的:
# 2.4.1 添加权限
**路径:**该页面的Manage > API permissions > Add a permission
# 2.4.2 由管理员授予权限
# 3. 在 Dynamics 365 中配置 S2S 身份验证
在Dynamics 365 CRM的应用服务器上,以管理员身份启动 Azure Active Directory PowerShell 模块
# 3.1 运行 PowerShell 脚本
- 目的:运行
CertificateReconfiguration.ps1
脚本,这一步会把 S2S 身份信息写入 Dynamics 配置数据库。
$ConfigureCrmServerSideSyncWithCommand = ".\ConfigureCrmServerSideSync.ps1 -privateKeyPassword (ConvertTo- SecureString 'personal_certfile_password' -AsPlainText -Force) -pfxFilePath c:\Personalcertfile.pfx -organizationName organization_name -microsoftEntraIdTenantIdOrDomainName microsoft_entraid_tenantid_or_domain_name -ClientID app_id_from_step3 -ClientSecret -client_secret"
Invoke-Expression -command $ConfigureCrmServerSideSyncWithCommand
2
带下划线的占位符替换成下列实际值填入:
(1) 在步骤1中得到的:
$privateKeyPassword
【证书私钥的密码(SecureString
类型)】
$pfxFilePath
【PFX 文件路径(包含证书和私钥的文件)】
(2)$organizationName
【CRM组织名称】
(3)步骤2中得到的:
$microsoftEntraIdTenantIdOrDomainName
【Microsoft Entra ID(Azure AD)的租户 ID 或租户主域名比如contoso.onmicrosoft.com】$clientID
【在 Entra ID 中注册的应用程序 ID(Application ID)】$clientSecret
【上述应用的客户端密钥(client secret)】
# 4. 设置 Exchange Online 租户 ID
在适用于 Windows PowerShell shell Azure Active Directory 模块中,运行下列命令。
$CRMContextId = (Get-MsolCompanyInformation).ObjectID $CRMContextId
1
2将显示的 GUID 复制到剪贴板。
通过运行以下命令更新组织的 S2STenantId,其中,OrganizationName 是组织的唯一名称,ExchangeOnlineTenantId 是上一步中检索到的 TenantId。
$organizationName = "OrganizationName" $CRMContextId = "ExchangeOnlineTenantId" $orgInfo = Get-CrmOrganization -Name $organizationName $ID = $orgInfo.id if($ID) { Set-CrmAdvancedSetting -ID $orgInfo.ID -configurationEntityName "Organization" -setting "S2STenantId" -value $CRMContextId }
1
2
3
4
5
6
7
8
9
# 5. 创建电子邮件服务器配置文件
- 创建 Exchange Online 的 Email Server Profile
- 指定身份验证类型为 Server-to-Server
# 6. 参考链接
将 Customer Engagement (on-premises) 连接到 Exchange Online (opens new window)