本文演示了配置从 Microsoft Entra ID 到 SAP Cloud Identity Services 的预配的步骤。 其目标是设置 Microsoft Entra ID 以自动向 SAP 云标识服务预配和取消预配用户,以便这些用户可以向 SAP 云标识服务进行身份验证,并有权访问其他 SAP 工作负载。 SAP Cloud Identity Services 支持将其本地标识目录中的信息预配到其他作为目标系统的 SAP 应用程序中。
注意
本文介绍在 Microsoft Entra 用户预配服务中内置的连接器。 有关此服务的用途、运作机制及常见问题的重要详细信息,请参阅 使用 Microsoft Entra ID 自动预配和取消预配 SaaS 应用程序。 SAP 云标识服务也有自己的单独连接器,用于从 Microsoft Entra ID 读取用户和组。 有关详细信息,请参阅 SAP Cloud Identity Services - Identity Provisioning - Microsoft Entra ID 作为源系统。
注意
新版本的 SAP Cloud Identity Services 连接器已正式发布,现在是 Microsoft Entra 应用库中 SAP Cloud Identity Services 列表的默认版本。 此连接器的当前版本具有以下更改:
- 已更新到 SCIM 2.0 标准
- 支持对 SAP Cloud Identity Services 进行组配置和取消配置
- 支持自定义扩展属性
- 支持 OAuth 2.0 客户端凭据授予
先决条件
本文中概述的方案假定你已具备以下先决条件:
- SAP 云标识服务租户
- SAP 云标识服务中具有管理员权限的用户帐户。
- 使用组预配功能需要Microsoft Entra ID P1 许可证。
注意
此集成也可以通过 Microsoft Entra 美国政府云环境使用。 可以在“Microsoft Entra 美国政府云应用程序库”中找到此应用程序,并以与公有云环境相同的方式对其进行配置。
如果您尚未在 Microsoft Entra ID 中拥有用户,请从文章 计划部署 Microsoft Entra,以使用 SAP 源应用程序和目标应用程序进行用户预配 开始。 本文说明如何将 Microsoft Entra 与组织中的权威来源(如 SAP SuccessFactors)连接,以获取员工名单。 教程中还演示了如何使用 Microsoft Entra 为这些辅助角色设置身份,以便其能够登录一个或多个 SAP 应用程序(例如 SAP ECC 或 SAP S/4HANA)。
如果您在生产环境中配置进入 SAP Cloud Identity Services 的预配,使用 Microsoft Entra ID Governance 管理对 SAP 工作负荷的访问,请在进行 Microsoft Entra ID 的标识治理配置之前,先查看先决条件。
设置 SAP 云标识服务以进行预配
在本文中,你将在 SAP Cloud Identity Services 中添加一个管理系统,然后配置 Microsoft Entra。
登录到 SAP 云标识服务管理控制台
https://<tenantID>.accounts.ondemand.com/admin(如果是试用,则https://<tenantID>.trial-accounts.ondemand.com/admin)。 导航到“用户和授权”>“管理员”。
按左侧面板上的“+添加”按钮,向列表中添加新的管理员。 选择“添加系统”并输入系统名称。
注意
SAP 云标识服务中的管理员标识必须是“系统”类型。 预配时,管理员用户无法向 SAP SCIM API 进行身份验证。 SAP Cloud Identity Services 不允许在创建系统后更改系统的名称。
在“配置授权”下,开启“管理用户”的切换按钮。 然后选择“ 保存 ”以创建系统。
创建管理员系统后,向该系统添加新机密。
复制 SAP 生成的 客户端 ID 和 客户端密码 。 这些值分别在“管理员用户名”和“管理员密码”字段中输入。 这是在 SAP Cloud Identity Services 应用程序的“预配”选项卡中完成的,在下一部分进行设置。
SAP 云标识服务可映射到一个或多个 SAP 应用程序作为目标系统。 检查用户上是否有通过 SAP 云标识服务预配这些 SAP 应用程序所需的任何属性。 本文假设 SAP Cloud Identity Services 和下游目标系统需要两个属性,
userName以及emails[type eq "work"].value。 如果 SAP 目标系统需要其他属性,并且这些属性不属于Microsoft Entra ID 用户架构,则可能需要配置 同步扩展属性。
从库中添加 SAP 云标识服务
在将 Microsoft Entra ID 配置为自动向 SAP 云标识服务预配用户之前,需要将 Microsoft Entra 应用程序库中的 SAP 云标识服务添加到租户的企业应用程序列表中。 可以在 Microsoft Entra 管理中心或通过 图形 API 执行此步骤。
如果 SAP 云标识服务已配置为从 Microsoft Entra 进行单一登录,并且企业应用程序的 Microsoft Entra 列表中已存在应用程序,那么请继续下一部分。
若要使用 Microsoft Entra 管理中心添加 Microsoft Entra 应用程序库中的 SAP 云标识服务,请执行以下步骤:
- 以至少云应用程序管理员身份登录到 Microsoft Entra 管理中心。
- 浏览到 Entra ID>企业应用>新应用。
- 若要添加库中的应用,请在搜索框中键入“SAP 云标识服务”。
- 从结果面板中选择“SAP 云标识服务”,然后添加该应用。 在该应用添加到租户时等待几秒钟。
为 SAP 云标识服务配置用户自动预配
本部分将指导你完成配置 Microsoft Entra 预配服务的步骤,以便根据 Microsoft Entra ID 中应用程序的用户和组分配,在 SAP Cloud Identity Services 中创建、更新和禁用用户和组。
要在 Microsoft Entra ID 中为 SAP 云标识服务配置自动用户预配,请执行以下操作:
以至少云应用程序管理员身份登录到 Microsoft Entra 管理中心。
浏览到 Entra ID>企业应用
在应用程序列表中,选择应用程序“SAP 云标识服务”。
选择“属性”选项卡。
验证“需要分配?”选项是否设置为“是”。 如果设置为“否”,则目录中的所有用户(包括外部标识)都可以访问应用程序,并且无法评审对应用程序的访问。
选择“预配”选项卡。
将“预配模式”设置为“自动”。
在 “管理员凭据 ”部分下,选择 “OAuth2 客户端凭据授予”。 输入
https://<tenantID>.accounts.ondemand.com/scim,如果是试用,请用https://<tenantid>.trial-accounts.ondemand.com/scim,在 租户 URL 中输入 SAP Cloud Identity Services 的租户 ID。 输入 令牌终结点,其外观可能如下所示https://<tenantID>.accounts.ondemand.com/oauth2/token。 输入以前从 SAP Cloud Identity Services 管理控制台生成的客户端 ID 和客户端机密值。 选择 “测试连接 ”以确保Microsoft Entra ID 可以连接到 SAP Cloud Identity Services。 如果连接失败,请确保 SAP 云标识服务系统帐户具有管理员权限,密码仍然有效,然后重试。
在“通知电子邮件”字段中,输入应接收预配错误通知的个人或组的电子邮件地址,并选中复选框“发生故障时发送电子邮件通知” 。
选择“ 保存”。
在“ 映射 ”部分下,根据方案选择 “预配Microsoft Entra ID 用户 或 预配Microsoft Entra ID 组 。
在“ 属性映射 ”部分中查看从 Microsoft Entra ID 同步到 SAP Cloud Identity Services 的用户和组属性。 如果看不到 SAP Cloud Identity Services 中可用作映射目标的属性,请选择“显示高级选项”,然后选择“编辑 SAP Cloud Platform Identity Authentication 服务的属性列表”以编辑受支持的属性列表。 添加 SAP 云标识服务租户的属性。
查看并记录选择为 匹配 属性的源属性和目标属性、具有 匹配优先级的映射,因为这些属性用于匹配 SAP Cloud Identity Services 中用于Microsoft Entra 预配服务中的用户和组,以确定是创建新用户/组还是更新现有用户/组。 有关匹配的详细信息,请参阅 源系统和目标系统中的匹配用户。 在后续步骤中,请确保 SAP Cloud Identity Services 中的任何用户都已将属性选为 “匹配 ”属性,以防止创建重复用户。
确认是否存在映射到应用程序属性的
IsSoftDeleted属性映射或包含IsSoftDeleted的函数。 当用户从应用程序取消分配、在 Microsoft Entra ID 中被软删除或被阻止登录时,Microsoft Entra 预配服务将更新映射到isSoftDeleted的属性。 如果未映射任何属性,则以后从应用程序角色取消分配的用户将继续存在于应用程序的数据存储中。添加 SAP 云标识服务或下游目标 SAP 系统所需的任何其他映射。
选择“保存”按钮以提交任何更改。
用户属性 类型 支持筛选 SAP 云标识服务必需 userName字符串 ✓ ✓ emails[type eq "work"].value字符串 ✓ active布尔 displayName字符串 urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:manager参考 addresses[type eq "work"].country字符串 addresses[type eq "work"].locality字符串 addresses[type eq "work"].postalCode字符串 addresses[type eq "work"].region字符串 addresses[type eq "work"].streetAddress字符串 name.givenName字符串 name.familyName字符串 name.honorificPrefix字符串 phoneNumbers[type eq "fax"].value字符串 phoneNumbers[type eq "mobile"].value字符串 phoneNumbers[type eq "work"].value字符串 urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:costCenter字符串 urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:department字符串 urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:division字符串 urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:employeeNumber字符串 urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:organization字符串 locale字符串 timezone字符串 userType字符串 company字符串 urn:sap:cloud:scim:schemas:extension:custom:2.0:User:attributes:customAttribute1字符串 urn:sap:cloud:scim:schemas:extension:custom:2.0:User:attributes:customAttribute2字符串 urn:sap:cloud:scim:schemas:extension:custom:2.0:User:attributes:customAttribute3字符串 urn:sap:cloud:scim:schemas:extension:custom:2.0:User:attributes:customAttribute4字符串 urn:sap:cloud:scim:schemas:extension:custom:2.0:User:attributes:customAttribute5字符串 urn:sap:cloud:scim:schemas:extension:custom:2.0:User:attributes:customAttribute6字符串 urn:sap:cloud:scim:schemas:extension:custom:2.0:User:attributes:customAttribute7字符串 urn:sap:cloud:scim:schemas:extension:custom:2.0:User:attributes:customAttribute8字符串 urn:sap:cloud:scim:schemas:extension:custom:2.0:User:attributes:customAttribute9字符串 urn:sap:cloud:scim:schemas:extension:custom:2.0:User:attributes:customAttribute10字符串 sendMail字符串 mailVerified字符串 组属性 类型 支持筛选 SAP 云标识服务必需 id字符串 ✓ ✓ externalId字符串 displayName字符串 ✓ urn:sap:cloud:scim:schemas:extension:custom:2.0:Group:name字符串 urn:sap:cloud:scim:schemas:extension:custom:2.0:Group:description字符串 members参考 ✓ 若要配置范围筛选器,请参阅 范围筛选器文章中提供的以下说明。
若要为 SAP Cloud Identity Services 启用Microsoft Entra 预配服务,请将“设置”部分中的“预配状态”更改为“打开”。
对于“设置”部分中“范围”的值,请选择“仅同步已分配的用户和组”。
准备好预配时,选择“保存”。
此操作会对“设置”部分的“范围”中定义的所有用户启动初始同步 。 如果将范围设置为“仅同步已分配的用户和组”,但没有为应用程序分配用户或组,则在将用户分配到应用程序之前不会进行同步。
将新的测试用户从 Microsoft Entra ID 预配到 SAP 云标识服务
建议将单个新的 Microsoft Entra 测试用户分配到 SAP 云标识服务,以测试自动用户预配配置。
- 以至少云应用程序管理员和用户管理员身份登录到 Microsoft Entra 管理中心。
- 浏览到 Entra ID>用户。
- 选择“新建用户”“创建新用户”。
- 键入新测试用户的“用户主体名称”和“显示名称”。 用户主体名称必须是唯一的,不能与任何当前或以前的 Microsoft Entra 用户或 SAP 云标识服务用户相同。 依次选择“审阅 + 创建”和“创建”。
- 创建测试用户后,浏览到 Entra ID>Enterprise 应用。
- 选择 SAP 云标识服务应用程序。
- 依次选择“用户和组”和“添加用户/组”。
- 在“用户和组”中,选择“未选定”,并在文本框中键入测试用户的用户主体名称。
- 选择“选择”,然后选择“分配”。
- 选择“预配”,然后选择“按需预配”。
- 在“选择用户或组”文本框中,键入测试用户的用户主体名称。
- 选择“预配”。
- 等待预配完成。 如果成功,则会看到消息
Modified attributes (successful)。
还可以选择验证在用户超出应用程序范围时 Microsoft Entra 预配服务将预配的内容。
- 选择“用户和组” 。
- 选择测试用户,然后选择“删除”。
- 删除测试用户后,选择“预配”,然后选择“按需预配”。
- 在“选择用户或组”文本框中,键入刚取消分配的测试用户的用户主体名称。
- 选择“预配”。
- 等待预配完成。
最后,可以从 Microsoft Entra ID 中删除测试用户。
- 浏览到 Entra ID>用户。
- 选择测试用户,选择“删除”,然后选择“确定”。 此操作会从 Microsoft Entra ID 中软删除测试用户。
然后,还可以从 SAP 云标识服务中删除测试用户。
确保现有 SAP 云标识服务用户具有必要的匹配属性
在将非测试用户分配给 Microsoft Entra ID 中的 SAP 云标识服务应用程序之前,应确保任何已在 SAP 云标识服务中存在且代表 Microsoft Entra ID 中的同一用户的用户均已在 SAP 云标识服务中填充了映射属性。
在预配映射中,选择为匹配属性的属性用于将 Microsoft Entra ID 中的用户帐户与 SAP 云标识服务中的用户帐户进行匹配。 如果 Microsoft Entra ID 中存在与 SAP 云标识服务中不匹配的用户,则 Microsoft Entra 预配服务将尝试创建新用户。 如果 Microsoft Entra ID 中存在与 SAP 云标识服务中相匹配的用户,则 Microsoft Entra 预配服务将更新该 SAP 云标识服务用户。 因此,应确保 SAP 云标识服务中已存在的任何用户选择的属性都是已填充的匹配属性,否则可能会创建重复用户。 如果需要更改Microsoft Entra 应用程序属性映射中的匹配属性,请参阅 源系统和目标系统中的匹配用户。
登录到 SAP 云标识服务管理控制台
https://<tenantID>.accounts.ondemand.com/admin(如果是试用,则https://<tenantID>.trial-accounts.ondemand.com/admin)。导航到“用户和授权 > 导出用户”。
选择将 Microsoft Entra 用户与 SAP 中的用户匹配所需的所有特性。 这些属性包括
SCIM ID、userName、emails以及可能在 SAP 系统中用作标识符的的其他属性。选择“导出”并等待浏览器下载 CSV 文件。
打开 PowerShell 窗口。
在编辑器中键入以下脚本。 在第一行中,如果选择了
userName以外的其他匹配属性,请将sapScimUserNameField变量的值更改为 SAP 云标识服务属性的名称。 在第二行中,将已导出的 CSV 文件的文件名参数从Users-exported-from-sap.csv更改为已下载文件的名称。$sapScimUserNameField = "userName" $existingSapUsers = import-csv -Path ".\Users-exported-from-sap.csv" -Encoding UTF8 $count = 0 $warn = 0 foreach ($u in $existingSapUsers) { $id = $u.id if (($null -eq $id) -or ($id.length -eq 0)) { write-error "Exported CSV file doesn't contain the ID attribute of SAP Cloud Identity Services users." throw "ID attribute not available, re-export" return } $count++ $userName = $u.$sapScimUserNameField if (($null -eq $userName) -or ($userName.length -eq 0)) { write-warning "SAP Cloud Identity Services user $id doesn't have a $sapScimUserNameField attribute populated" $warn++ } } write-output "$warn of $count users in SAP Cloud Identity Services did not have the $sapScimUserNameFIeld attribute populated."运行该脚本。 脚本完成后,如果存在一个或多个缺少所需匹配属性的用户,请在导出的 CSV 文件或 SAP 云标识服务管理控制台中查找这些用户。 如果这些用户也存在于 Microsoft Entra 中,则需要首先更新这些用户的 SAP Cloud Identity Services 表示形式,以便填充匹配的属性。
在 SAP 云标识服务中更新这些用户的属性后,请从 SAP 云标识服务重新导出用户(如本部分中的步骤 2-5 和 PowerShell 步骤中所述),以确认 SAP 云标识服务中没有用户缺少匹配属性,否则会阻碍预配到这些用户。
有了从 SAP Cloud Identity Services 获取的所有用户的列表后,即可将应用程序数据存储中的这些用户与已在 Microsoft Entra ID 中的用户匹配,以确定哪些用户应在预配范围内。
检索 Microsoft Entra ID 中用户的 ID
本部分演示如何使用 Microsoft Graph PowerShell cmdlet 与 Microsoft Entra ID 进行交互。
组织首次将这些 cmdlet 用于此方案时,需要具有全局管理员角色才能允许将 Microsoft Graph PowerShell 用于租户。 后续交互可以使用较低特权角色,例如:
- 用户管理员(如果预计会创建新用户)。
- 在您仅负责管理应用程序角色分配的情况下,可以是应用程序管理员或 标识治理管理员。
打开 PowerShell。
如果没有已安装 Microsoft Graph PowerShell 模块 ,请使用以下命令安装
Microsoft.Graph.Users模块和其他模块:Install-Module Microsoft.Graph如果已安装模块,请确保使用的是最新版本:
Update-Module microsoft.graph.users,microsoft.graph.identity.governance,microsoft.graph.applications连接到 Microsoft Entra ID:
$msg = Connect-MgGraph -ContextScope Process -Scopes "User.ReadWrite.All,Application.ReadWrite.All,AppRoleAssignment.ReadWrite.All,EntitlementManagement.ReadWrite.All"如果这是你第一次使用此命令,则可能需要同意允许 Microsoft Graph 命令行工具具有这些权限。
将从应用程序数据存储中获取的用户列表读取到 PowerShell 会话中。 如果用户列表位于 CSV 文件中,则可以使用 PowerShell cmdlet
Import-Csv,并将上一部分中的文件的名称作为参数提供。例如,如果将从 SAP 云标识服务获取的文件命名为 Users-exported-from-sap.csv 并位于当前目录中,则输入此命令。
$filename = ".\Users-exported-from-sap.csv" $dbusers = Import-Csv -Path $filename -Encoding UTF8另举一例,如果使用了数据库或目录,并将该文件命名为 users.csv 且位于当前目录中,则输入以下命令:
$filename = ".\users.csv" $dbusers = Import-Csv -Path $filename -Encoding UTF8选择 users.csv 文件中与 Microsoft Entra ID 用户属性匹配的列。
如果使用 SAP 云标识服务,则默认映射是 SAP SCIM 属性
userName与 Microsoft Entra ID 属性userPrincipalName:$db_match_column_name = "userName" $azuread_match_attr_name = "userPrincipalName"另举一例,如果使用了数据库或目录,则在你拥有用户的数据库中,名为
EMail的列中的值将与 Microsoft Entra 属性userPrincipalName中的值相同:$db_match_column_name = "EMail" $azuread_match_attr_name = "userPrincipalName"检索 Microsoft Entra ID 中的这些用户的 ID。
以下 PowerShell 脚本使用前面指定的
$dbusers、$db_match_column_name和$azuread_match_attr_name值。 它会查询 Microsoft Entra ID 以查找属性具有源文件中每个记录的匹配值的用户。 如果从源 SAP 云标识服务、数据库或目录获取的文件中存在许多用户,则可能需要几分钟时间才能完成此脚本。 如果在 Microsoft Entra ID 中没有具有该值的属性,并且需要使用contains或其他筛选表达式,则需要在下面的步骤 11 中自定义此脚本和该内容,以使用其他筛选表达式。$dbu_not_queried_list = @() $dbu_not_matched_list = @() $dbu_match_ambiguous_list = @() $dbu_query_failed_list = @() $azuread_match_id_list = @() $azuread_not_enabled_list = @() $dbu_values = @() $dbu_duplicate_list = @() foreach ($dbu in $dbusers) { if ($null -ne $dbu.$db_match_column_name -and $dbu.$db_match_column_name.Length -gt 0) { $val = $dbu.$db_match_column_name $escval = $val -replace "'","''" if ($dbu_values -contains $escval) { $dbu_duplicate_list += $dbu; continue } else { $dbu_values += $escval } $filter = $azuread_match_attr_name + " eq '" + $escval + "'" try { $ul = @(Get-MgUser -Filter $filter -All -Property Id,accountEnabled -ErrorAction Stop) if ($ul.length -eq 0) { $dbu_not_matched_list += $dbu; } elseif ($ul.length -gt 1) {$dbu_match_ambiguous_list += $dbu } else { $id = $ul[0].id; $azuread_match_id_list += $id; if ($ul[0].accountEnabled -eq $false) {$azuread_not_enabled_list += $id } } } catch { $dbu_query_failed_list += $dbu } } else { $dbu_not_queried_list += $dbu } }查看以前查询的结果。 请查看 SAP 云标识服务、数据库或目录中是否存在任何用户由于错误或缺少匹配项而无法在 Microsoft Entra ID 中找到。
以下 PowerShell 脚本将显示未找到的记录计数:
$dbu_not_queried_count = $dbu_not_queried_list.Count if ($dbu_not_queried_count -ne 0) { Write-Error "Unable to query for $dbu_not_queried_count records as rows lacked values for $db_match_column_name." } $dbu_duplicate_count = $dbu_duplicate_list.Count if ($dbu_duplicate_count -ne 0) { Write-Error "Unable to locate Microsoft Entra ID users for $dbu_duplicate_count rows as multiple rows have the same value" } $dbu_not_matched_count = $dbu_not_matched_list.Count if ($dbu_not_matched_count -ne 0) { Write-Error "Unable to locate $dbu_not_matched_count records in Microsoft Entra ID by querying for $db_match_column_name values in $azuread_match_attr_name." } $dbu_match_ambiguous_count = $dbu_match_ambiguous_list.Count if ($dbu_match_ambiguous_count -ne 0) { Write-Error "Unable to locate $dbu_match_ambiguous_count records in Microsoft Entra ID as attribute match ambiguous." } $dbu_query_failed_count = $dbu_query_failed_list.Count if ($dbu_query_failed_count -ne 0) { Write-Error "Unable to locate $dbu_query_failed_count records in Microsoft Entra ID as queries returned errors." } $azuread_not_enabled_count = $azuread_not_enabled_list.Count if ($azuread_not_enabled_count -ne 0) { Write-Error "$azuread_not_enabled_count users in Microsoft Entra ID are blocked from sign-in." } if ($dbu_not_queried_count -ne 0 -or $dbu_duplicate_count -ne 0 -or $dbu_not_matched_count -ne 0 -or $dbu_match_ambiguous_count -ne 0 -or $dbu_query_failed_count -ne 0 -or $azuread_not_enabled_count) { Write-Output "You will need to resolve those issues before access of all existing users can be reviewed." } $azuread_match_count = $azuread_match_id_list.Count Write-Output "Users corresponding to $azuread_match_count records were located in Microsoft Entra ID."脚本完成以后,如果数据源中有任何记录在 Microsoft Entra ID 中无法找到,系统会提示错误。 如果并非应用程序数据存储中用户的所有记录都可以在 Microsoft Entra ID 中作为用户找到,则需要调查哪些记录不匹配以及原因。
例如,某人在 Microsoft Entra ID 中的电子邮件地址和 userPrincipalName 可能已更改,但在应用程序的数据源中未更新其相应的
mail属性。 或者,用户可能已经离开了组织,但仍处于应用程序的数据源中。 或者,应用程序数据源中可能有一个供应商或超级管理员帐户,该帐户与 Microsoft Entra ID 中的任何特定人员都不对应。如果存在无法在 Microsoft Entra ID 中找到的用户,或有用户未处于活动状态并且能够登录,但你想要审查其权限或在 SAP 云标识服务、数据库或目录中更新其属性,则需要更新应用程序、匹配规则,或为其更新或创建 Microsoft Entra 用户。 有关要进行更改的详细信息,请参阅 管理与Microsoft Entra ID 中的用户不匹配的应用程序中的映射和用户帐户。
如果选择用于在 Microsoft Entra ID 中创建用户的选项,则可以使用以下任一方法批量创建用户:
- CSV 文件,如在 Microsoft Entra 管理中心批量创建用户中所述
- New-MgUser cmdlet
确保使用 Microsoft Entra ID 所需的属性填充这些新用户,以便稍后将其与应用程序中的现有用户以及 Microsoft Entra ID 所需的属性(包括
userPrincipalName、mailNickname和displayName)匹配。userPrincipalName对于目录中的所有用户必须是唯一的。例如,数据库中可能有用户,其中,
EMail列中的值是要用作 Microsoft Entra 用户主体名称的值,Alias列中的值包含 Microsoft Entra ID 邮件别名,Full name列中的值包含用户的显示名称:$db_display_name_column_name = "Full name" $db_user_principal_name_column_name = "Email" $db_mail_nickname_column_name = "Alias"然后,可以使用此脚本为 SAP 云标识服务、数据库或目录中与 Microsoft Entra ID 用户不匹配的用户创建 Microsoft Entra 用户。 请注意,可能需要修改此脚本以添加组织中所需的其他 Microsoft Entra 属性,或者如果
$azuread_match_attr_name既不是mailNickname也不是userPrincipalName,则提供该 Microsoft Entra 属性。$dbu_missing_columns_list = @() $dbu_creation_failed_list = @() foreach ($dbu in $dbu_not_matched_list) { if (($null -ne $dbu.$db_display_name_column_name -and $dbu.$db_display_name_column_name.Length -gt 0) -and ($null -ne $dbu.$db_user_principal_name_column_name -and $dbu.$db_user_principal_name_column_name.Length -gt 0) -and ($null -ne $dbu.$db_mail_nickname_column_name -and $dbu.$db_mail_nickname_column_name.Length -gt 0)) { $params = @{ accountEnabled = $false displayName = $dbu.$db_display_name_column_name mailNickname = $dbu.$db_mail_nickname_column_name userPrincipalName = $dbu.$db_user_principal_name_column_name passwordProfile = @{ Password = -join (((48..90) + (96..122)) * 16 | Get-Random -Count 16 | % {[char]$_}) } } try { New-MgUser -BodyParameter $params } catch { $dbu_creation_failed_list += $dbu; throw } } else { $dbu_missing_columns_list += $dbu } }将任何缺失的用户添加到 Microsoft Entra ID 后,再次运行步骤 7 中的脚本。 然后运行步骤 8 中的脚本。 检查是否未报告任何错误。
$dbu_not_queried_list = @() $dbu_not_matched_list = @() $dbu_match_ambiguous_list = @() $dbu_query_failed_list = @() $azuread_match_id_list = @() $azuread_not_enabled_list = @() $dbu_values = @() $dbu_duplicate_list = @() foreach ($dbu in $dbusers) { if ($null -ne $dbu.$db_match_column_name -and $dbu.$db_match_column_name.Length -gt 0) { $val = $dbu.$db_match_column_name $escval = $val -replace "'","''" if ($dbu_values -contains $escval) { $dbu_duplicate_list += $dbu; continue } else { $dbu_values += $escval } $filter = $azuread_match_attr_name + " eq '" + $escval + "'" try { $ul = @(Get-MgUser -Filter $filter -All -Property Id,accountEnabled -ErrorAction Stop) if ($ul.length -eq 0) { $dbu_not_matched_list += $dbu; } elseif ($ul.length -gt 1) {$dbu_match_ambiguous_list += $dbu } else { $id = $ul[0].id; $azuread_match_id_list += $id; if ($ul[0].accountEnabled -eq $false) {$azuread_not_enabled_list += $id } } } catch { $dbu_query_failed_list += $dbu } } else { $dbu_not_queried_list += $dbu } } $dbu_not_queried_count = $dbu_not_queried_list.Count if ($dbu_not_queried_count -ne 0) { Write-Error "Unable to query for $dbu_not_queried_count records as rows lacked values for $db_match_column_name." } $dbu_duplicate_count = $dbu_duplicate_list.Count if ($dbu_duplicate_count -ne 0) { Write-Error "Unable to locate Microsoft Entra ID users for $dbu_duplicate_count rows as multiple rows have the same value" } $dbu_not_matched_count = $dbu_not_matched_list.Count if ($dbu_not_matched_count -ne 0) { Write-Error "Unable to locate $dbu_not_matched_count records in Microsoft Entra ID by querying for $db_match_column_name values in $azuread_match_attr_name." } $dbu_match_ambiguous_count = $dbu_match_ambiguous_list.Count if ($dbu_match_ambiguous_count -ne 0) { Write-Error "Unable to locate $dbu_match_ambiguous_count records in Microsoft Entra ID as attribute match ambiguous." } $dbu_query_failed_count = $dbu_query_failed_list.Count if ($dbu_query_failed_count -ne 0) { Write-Error "Unable to locate $dbu_query_failed_count records in Microsoft Entra ID as queries returned errors." } $azuread_not_enabled_count = $azuread_not_enabled_list.Count if ($azuread_not_enabled_count -ne 0) { Write-Warning "$azuread_not_enabled_count users in Microsoft Entra ID are blocked from sign-in." } if ($dbu_not_queried_count -ne 0 -or $dbu_duplicate_count -ne 0 -or $dbu_not_matched_count -ne 0 -or $dbu_match_ambiguous_count -ne 0 -or $dbu_query_failed_count -ne 0 -or $azuread_not_enabled_count -ne 0) { Write-Output "You will need to resolve those issues before access of all existing users can be reviewed." } $azuread_match_count = $azuread_match_id_list.Count Write-Output "Users corresponding to $azuread_match_count records were located in Microsoft Entra ID."
确保现有 Microsoft Entra 用户具有必要的属性
启用自动用户预配之前,必须确定 Microsoft Entra ID 中哪些用户需要访问 SAP 云标识服务,然后需要检查以确保这些用户在 Microsoft Entra ID 中具有必要的属性,并且这些属性已映射到 SAP 云标识服务的预期架构。
- 默认情况下,Microsoft Entra 用户
userPrincipalName属性的值均映射到 SAP 云标识服务的userName和emails[type eq "work"].value属性。 如果用户的电子邮件地址与其用户主体名称不同,则可能需要更改此映射。 - 如果公司 ZIP/邮政编码的格式与公司国家或地区不匹配,SAP Cloud Identity Services 可能会忽略属性的值
postalCode。 - 默认情况下,Microsoft Entra 属性
country映射到 SAP Cloud Identity Servicesaddresses[type eq "work"].country字段。 如果特性的值country不是两个字符 ISO 3166 国家/地区代码,则在 SAP Cloud Identity Services 中创建这些用户可能会失败。 有关详细信息,请参阅 countries.properties。 - 默认情况下,Microsoft Entra 属性
department映射到 SAP 云标识服务urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:department属性。 如果 Microsoft Entra 用户具有department属性的值,则这些值必须与 SAP 云标识服务中已配置的部门匹配,否则用户的创建或更新将失败。 有关详细信息,请参阅 departments.properties。department如果Microsoft Entra 用户中的值与 SAP 环境中的值不一致,请在分配用户之前更新 Microsoft Entra 中的部门值、更新 SAP Cloud Identity Services 中允许的部门值或删除映射。 - SAP 云标识服务的 SCIM 终结点要求某些属性采用特定格式。 可以 在此处详细了解这些属性及其特定格式。
在 Microsoft Entra ID 中将用户分配到 SAP 云标识服务应用程序
Microsoft Entra ID 使用名为 分配 的概念来确定哪些用户应接收对所选应用的访问权限。 在自动用户预配的情况下,如果“范围”的“设置”值为“仅同步已分配的用户和组”,那么只有已分配给 Microsoft Entra ID 中该应用程序的应用程序角色的用户和组会与 SAP 云标识服务同步。 如果将用户分配到 SAP 云标识服务,则必须在“分配”对话框中选择任何特定于应用程序的有效角色(如果可用)。 具有“默认访问权限” 角色的用户排除在预配之外。 目前,SAP 云标识服务的唯一可用角色是“用户”。
如果为应用程序启用了预配,请在将更多用户分配到应用程序之前检查应用程序预配是否未处于 隔离 状态。 在继续之前,请解决导致隔离的所有问题。
检查已经存在于 SAP Cloud Identity Services 中的用户,但尚未在 Microsoft Entra ID 的应用中分配任务的用户
前面的步骤评估了 SAP 云标识服务中的用户是否也作为 Microsoft Entra ID 中的用户存在。 但是,它们可能并未在当前全部都分配给 Microsoft Entra ID 中的应用程序角色。 因此,后续步骤是查看哪些用户没有分配应用程序角色。
使用 PowerShell 查找应用程序服务主体的服务主体 ID。
例如,如果企业应用程序命名为
SAP Cloud Identity Services,请输入以下命令:$azuread_app_name = "SAP Cloud Identity Services" $azuread_sp_filter = "displayName eq '" + ($azuread_app_name -replace "'","''") + "'" $azuread_sp = Get-MgServicePrincipal -Filter $azuread_sp_filter -All检索当前已分配到 Microsoft Entra ID 中应用程序的用户。
这建立在上一命令中设置的
$azuread_sp变量的基础上。$azuread_existing_assignments = @(Get-MgServicePrincipalAppRoleAssignedTo -ServicePrincipalId $azuread_sp.Id -All)将 SAP 云标识服务和 Microsoft Entra ID 中已有用户的用户 ID 列表与当前分配给 Microsoft Entra ID 中应用程序的用户进行比较。 此脚本建立在上一部分中设置的
$azuread_match_id_list变量的基础上:$azuread_not_in_role_list = @() foreach ($id in $azuread_match_id_list) { $found = $false foreach ($existing in $azuread_existing_assignments) { if ($existing.principalId -eq $id) { $found = $true; break; } } if ($found -eq $false) { $azuread_not_in_role_list += $id } } $azuread_not_in_role_count = $azuread_not_in_role_list.Count Write-Output "$azuread_not_in_role_count users in the application's data store aren't assigned to the application roles."如果没有用户未分配到应用程序角色,则表示所有用户都已分配到应用程序角色,表明 Microsoft Entra ID 和 SAP 云标识服务中没有共同的用户,因此无需更改。 但是,如果 SAP Cloud Identity Services 中的一个或多个用户当前未分配给应用程序角色,则需要继续该过程并将其添加到应用程序角色之一。
选择应用程序服务主体的
User角色。$azuread_app_role_name = "User" $azuread_app_role_id = ($azuread_sp.AppRoles | where-object {$_.AllowedMemberTypes -contains "User" -and $_.DisplayName -eq "User"}).Id if ($null -eq $azuread_app_role_id) { write-error "role $azuread_app_role_name not located in application manifest"}为 SAP 云标识服务和 Microsoft Entra 中已存在但当前尚未分配到应用程序角色的用户创建应用程序角色分配:
foreach ($u in $azuread_not_in_role_list) { $res = New-MgServicePrincipalAppRoleAssignedTo -ServicePrincipalId $azuread_sp.Id -AppRoleId $azuread_app_role_id -PrincipalId $u -ResourceId $azuread_sp.Id }等待一分钟,以便在 Microsoft Entra ID 中传播更改。
在下一个 Microsoft Entra 预配周期中,Microsoft Entra 预配服务会将分配给应用程序的这些用户的表示形式与 SAP 云标识服务中的表示形式进行比较,并将 SAP 云标识服务用户更新为具有 Microsoft Entra ID 的属性。
分配剩余用户并监视初始同步
测试完成后,用户已成功预配到 SAP 云标识服务,并且任何现有的 SAP 云标识服务用户都已分配到应用程序角色,可以按照此处的其中一条说明,将任何其他授权用户分配给 SAP 云标识服务应用程序:
- 可以在 Microsoft Entra 管理中心将 每个用户分配到应用程序 ,
- 可以通过 PowerShell cmdlet
New-MgServicePrincipalAppRoleAssignedTo将单个用户分配给应用程序,如上一部分所示,或者 - 如果组织具有Microsoft Entra ID Governance 的许可证,则还可以 部署权利管理策略,以便自动执行访问分配。
用户分配给应用程序角色并处于预配范围后,Microsoft Entra 预配服务会将这些用户预配到 SAP 云标识服务。 请注意,初始同步执行的时间长于后续同步,只要 Microsoft Entra 预配服务正在运行,则大约每隔 40 分钟就会进行一次同步。
如果您未看到用户得到预配,请查看有关用户未预配的故障排除指南中的步骤。 然后,通过 Microsoft Entra 管理中心 或 Graph API 检查预配日志。 按状态“失败”筛选日志。 如果出现 ErrorCode 为 DuplicateTargetEntries 的故障,这表示您的预配匹配准则存在歧义性,您需要更新用于匹配的 Microsoft Entra 用户或映射,以确保每个 Microsoft Entra 用户与一个应用程序用户相匹配。 然后按操作“创建”和状态“已跳过”来筛选日志。 如果使用 NotEffectivelyEntitled 的 SkipReason 代码跳过用户,这可能表示Microsoft Entra ID 中的用户帐户不匹配,因为用户帐户状态 已禁用。
配置单一登录
还可以选择按照 SAP Cloud Identity Services 单一登录文章中提供的说明为 SAP Cloud Identity Services 启用基于 SAML 的单一登录。 可独立于自动用户预配来配置单一登录,尽管这两个功能互相补充。
监视预配
可以使用 “同步详细信息”部分来监控进度,并点击链接查看“配置活动报告”,其中描述了 Microsoft Entra 配置服务在 SAP 云身份服务上执行的所有操作。 还可以通过 Microsoft Graph API 监视预配项目。
有关如何读取Microsoft Entra 预配日志的详细信息,请参阅 有关自动用户帐户预配的报告。
维护应用程序角色分配
当被分配到应用程序的用户在 Microsoft Entra ID 中进行更新时,这些更改会自动预配置到 SAP Cloud Identity Services。
如果有 Microsoft Entra ID Governance,则可以自动更改 Microsoft Entra ID 中 SAP 云标识服务的应用程序角色分配,以便在人员加入组织、离开或更改角色时添加或删除分配。
- 你可以 对应用程序角色分配进行一次性或定期访问评审。
- 可以为 此应用程序创建权利管理访问包。 你可以为用户分配访问权限,策略包括当他们请求时、由管理员分配、基于规则自动分配或通过生命周期工作流分配。
更新 SAP Cloud Identity Services 应用以使用 SAP Cloud Identity Services 的 SCIM 2.0 接口
2025年9月,Microsoft发布了一个适用于SAP Cloud Identity Services的SCIM 2.0连接器,该连接器增加了对组预配和取消预配、自定义扩展属性以及OAuth 2.0客户端凭据授权的支持。
完成以下步骤将允许以前使用 SAP 云标识服务连接器的客户从 SCIM 1.0 终结点切换到 SCIM 2.0 终结点。
以至少云应用程序管理员身份登录到 Microsoft Entra 管理中心。
浏览至 Entra ID > Enterprise Apps > SAP Cloud Identity Services。
在 “属性” 部分中,复制对象 ID。
在新的 Web 浏览器窗口中,转到 https://developer.microsoft.com/graph/graph-explorer 并作为添加应用的 Microsoft Entra 租户的管理员登录。
检查以确保所使用的帐户具有正确的权限。 进行此更改需要权限“Directory.ReadWrite.All”。
使用之前从应用中选择的对象 ID,运行以下命令。
GET https://graph.microsoft.com/beta/servicePrincipals/[object-id]/synchronization/jobs/
- 从上一示例中请求的
GET响应正文获取“ID”值,运行以下命令,将“[job-id]”替换为请求中的GETID 值。 该值的格式应为“sapcloudidentityservices.xxxxxxxxxxxxxxx.xxxxxxxxxxxxxxx”:
DELETE https://graph.microsoft.com/beta/servicePrincipals/[object-id]/synchronization/jobs/[job-id]
- 在 Microsoft Graph 资源管理器中运行以下命令。 将“[object-id]”替换为从第三步复制的服务主体 ID(对象 ID)。
POST https://graph.microsoft.com/beta/servicePrincipals/[object-id]/synchronization/jobs { "templateId": "sapcloudidentityservices" }
返回到第一个 Web 浏览器窗口,然后选择应用程序的 “预配 ”选项卡。 配置将重置。 可以通过确认作业 ID 是否以“sapcloudidentityservices”开头,来判断升级是否成功。
将管理员凭据部分中的租户 URL 更新为以下内容:如果是试用版,请使用
https://<tenantID>.accounts.ondemand.com/scim,否则使用https://<tenantid>.trial-accounts.ondemand.com/service/scim。还原对应用程序所做的任何先前更改(身份验证详细信息、范围筛选器、自定义属性映射)并重新启用预配。
注意
未能恢复之前的设置可能会导致属性(例如 name.formatted)在 SAP Cloud Identity Services 中意外更新。 在启用预配之前,请务必检查配置。
Changelog
- 2025 年 9 月 30 日 - 正式发布使用 SCIM 2.0 终结点的 SAP 云标识服务连接器的新版本。 新版本支持 SAP Cloud Identity Services 的组配置和取消配置、自定义扩展属性,以及 OAuth 2.0 客户端凭据授权。