使用 Microsoft Entra ID 为 SAP Cloud Identity Services 配置自动用户预配

本文演示了配置从 Microsoft Entra ID 到 SAP Cloud Identity Services 的预配的步骤。 目标是设置Microsoft Entra ID以自动将用户预配和取消预配到 SAP Cloud Identity Services,以便这些用户可以向 SAP Cloud Identity Services 进行身份验证并有权访问其他 SAP 工作负荷。 SAP 云标识服务支持从其本地标识目录预配到其他 SAP 应用程序作为目标系统

注意

本文介绍在Microsoft Entra用户预配服务中内置的连接器。 有关此服务的功能、工作原理和常见问题的重要详细信息,请参阅 Automate 用户预配和取消预配到具有 Microsoft Entra ID 的 SaaS 应用程序。 SAP Cloud Identity Services 还有其自己的独立连接器,用于从Microsoft Entra ID读取用户和组。 有关详细信息,请参阅 SAP 云标识服务 - 标识预配 - Microsoft Entra ID作为源系统

注意

新版本的 SAP Cloud Identity Services 连接器已正式发布,现在是 Microsoft Entra 应用库中 SAP Cloud Identity Services 列表的默认版本。 此连接器的当前版本具有以下更改:

  • 已更新到 SCIM 2.0 标准
  • 支持对 SAP Cloud Identity Services 进行组配置和取消配置
  • 支持自定义扩展属性
  • 支持 OAuth 2.0 客户端凭据授予

重要

如果使用 SAP IAG 进行集成,则通过在用户名行中选择EDIT将 ObjectId Microsoft Entra 映射到用户名,并将 Source 和 Target 属性设置为:

  • 源属性:objectId
  • 目标属性:userName

先决条件

本文中概述的方案假定你已具备以下先决条件:

  • 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 治理 SAP 工作负载访问,请在继续操作之前查看 配置 Microsoft Entra ID 进行身份治理之前的先决条件

设置 SAP 云标识服务以进行预配

在本文中,你将在 SAP Cloud Identity Services 中添加一个管理系统,然后配置Microsoft Entra。

 SAP 应用程序、SAP Cloud Identity Services 和 Microsoft Entra 之间的 SSO 和预置流程的体系结构截图。

  1. 登录到 SAP 云标识服务管理控制台 https://<tenantID>.accounts.ondemand.com/admin(如果是试用,则 https://<tenantID>.trial-accounts.ondemand.com/admin)。 导航到“用户和授权”>“管理员”

    SAP Cloud Identity Services 管理控制台的屏幕截图。

  2. 按左侧面板上的“+添加”按钮,向列表中添加新的管理员。 选择“添加系统”并输入系统名称。

    注意

    SAP 云标识服务中的管理员标识必须是“系统”类型。 预配时,管理员用户无法向 SAP SCIM API 进行身份验证。 SAP Cloud Identity Services 不允许在创建系统后更改系统的名称。

  3. 在“配置授权”下,开启“管理用户”的切换按钮。 然后选择“ 保存 ”以创建系统。

    SAP Cloud Identity Services 添加 SCIM 的屏幕截图。

  4. 创建管理员系统后,向该系统添加新机密。

  5. 复制 SAP 生成的 客户端 ID客户端密码 。 这些值分别在“管理员用户名”和“管理员密码”字段中输入。 这将在你下一节设置的 SAP Cloud Identity Services 应用程序的“预配”选项卡中完成。

  6. SAP 云标识服务可映射到一个或多个 SAP 应用程序作为目标系统。 检查用户上是否有通过 SAP 云标识服务预配这些 SAP 应用程序所需的任何属性。 本文假设 SAP Cloud Identity Services 和下游目标系统需要两个属性, userName 以及 emails[type eq "work"].value。 如果 SAP 目标系统需要其他属性,并且这些属性不属于Microsoft Entra ID用户架构,则可能需要配置 synching 扩展属性

在将Microsoft Entra ID配置为将自动用户预配到 SAP Cloud Identity Services 之前,需要从Microsoft Entra应用程序库将 SAP Cloud Identity Services 添加到租户的企业应用程序列表。 可以在Microsoft Entra 管理中心或通过图形 API执行此步骤。

如果 SAP Cloud Identity Services 已通过 SAML 配置了来自 Microsoft Entra 的单一登录,并且你的 Microsoft Entra 企业应用程序列表中已存在一个应用程序,请继续下一节

注意

如果以前为 OpenID Connect 集成配置了应用程序注册,则无法为该应用程序注册配置预配。 而是创建单独的企业应用程序进行预配。

使用“Microsoft Entra 管理中心”添加 SAP Cloud Identity Services

若要使用 Microsoft Entra 管理中心 从 Microsoft Entra 应用程序库中添加 SAP Cloud Identity Services,请执行以下步骤:

  1. 以至少 云应用程序管理员 的身份登录到 Microsoft Entra 管理中心
  2. 浏览到 Entra ID>企业应用>新建应用程序
  3. 若要添加库中的应用,请在搜索框中键入“SAP 云标识服务”
  4. 从结果面板中选择“SAP 云标识服务”,然后添加该应用。 请稍等几秒钟,直到应用程序被添加到您的租户。
  5. 继续到下一节以配置预配。

使用 Microsoft Graph 添加 SAP Cloud Identity Services

可以通过图形 API创建应用程序和服务主体。

首先,检索 SAP Cloud Identity Services 的库应用程序模板标识符。

GET https://graph.microsoft.com/v1.0/applicationTemplates?$filter=displayName eq 'SAP Cloud Identity Services'

从响应中提取id应用程序模板。 然后,创建画廊应用程序和服务主体。

POST https://graph.microsoft.com/v1.0/applicationTemplates/{applicationTemplateId}/instantiate
Content-type: application/json

{
  "displayName": "SAP Cloud Identity Services"
}

响应将包含新的应用程序和服务主体对象。

接下来,使用刚刚创建的服务主体的 id 检索预配配置的模板。

GET https://graph.microsoft.com/beta/servicePrincipals/{id}/synchronization/templates

若要启用预配,需要创建作业。 使用以下请求创建配置任务。 使用上一步中的id作为templateId,以指定要用于作业的模板。

POST https://graph.microsoft.com/beta/servicePrincipals/{id}/synchronization/jobs
Content-type: application/json

{
    "templateId": "sapcloudidentityservices"
}

如下一节所述,然后你可以进一步配置与该服务主体关联的预配作业和模板架构。 然后,授权访问,以便Microsoft Entra对 SAP Cloud Identity Services 进行身份验证,然后启动预配作业

为 SAP 云标识服务配置用户自动预配

本节将指导你完成配置 Microsoft Entra 预配服务的步骤,以根据在 Microsoft Entra ID 中对应用程序分配的用户和组,在 SAP Cloud Identity Services 中创建、更新和禁用用户和组。

若要在 Microsoft Entra ID 中为 SAP Cloud Identity Services 配置自动用户预配,请执行以下操作:

  1. 以至少 云应用程序管理员 的身份登录到 Microsoft Entra 管理中心

  2. 浏览到 Entra ID>企业应用

    “企业应用程序”边栏选项卡的屏幕截图。

  3. 在应用程序列表中,选择应用程序“SAP 云标识服务”

    应用程序列表中的 SAP Cloud Identity Services 链接的屏幕截图。

  4. 选择“属性”选项卡。

  5. 验证“需要分配?”选项是否设置为“是”。 如果设置为“否”,则目录中的所有用户(包括外部标识)都可以访问应用程序,并且无法评审对应用程序的访问。

  6. 选择“预配”选项卡。

    “管理”选项的屏幕截图,其中突出显示了“预配”选项。

  7. 设置 + 新建配置

    “预配”选项卡的屏幕截图(自动)。

  8. “租户 URL ”字段中,输入 SAP Cloud Identity Services 租户 URL 和机密令牌。 选择测试连接以确保Microsoft Entra ID可以连接到 SAP Cloud Identity Services。 如果连接失败,请确保 SAP Cloud Identity Services 帐户具有所需的管理员权限,然后重试。

    预配测试连接的屏幕截图。

  9. 选择 “创建 ”以创建配置。

  10. “概述”页中选择“属性”。

  11. 选择铅笔以编辑属性。 启用通知电子邮件并提供电子邮件以接收隔离电子邮件。 启用意外删除预防。 选择“应用”保存更改。

    “预配属性”页的屏幕截图,其中显示了通知和删除设置。

  12. 在左侧面板中选择 “属性映射 ”,然后选择用户。

  13. Attribute Mapping 部分中查看从 Microsoft Entra ID 同步到 SAP Cloud Identity Services 的用户和组属性。 如果看不到 SAP Cloud Identity Services 中可用作映射目标的属性,请选择“显示高级选项”,然后选择“编辑 SAP Cloud Platform Identity Authentication 服务的属性列表”以编辑受支持的属性列表。 添加 SAP 云标识服务租户的属性。

  14. 查看并记录选择为 Matching 属性的源和目标属性,以及具有 Matching 优先级 的匹配映射,因为这些属性用于将 Microsoft Entra 预配服务中的用户和组与 SAP Cloud Identity Services 中的对应项相匹配,以确定是创建新的用户/组还是更新现有用户/组。 有关匹配的详细信息,请参阅 源系统和目标系统中的匹配用户。 在后续步骤中,请确保 SAP Cloud Identity Services 中的任何用户都已将属性选为 “匹配 ”属性,以防止创建重复用户。

  15. 确认是否存在映射到应用程序属性的 IsSoftDeleted 属性映射或包含 IsSoftDeleted 的函数。 当用户从应用程序取消分配、在 Microsoft Entra ID 中被软删除或被阻止登录时,Microsoft Entra 预配服务将更新映射到 isSoftDeleted 的属性。 如果未映射任何属性,则以后从应用程序角色取消分配的用户将继续存在于应用程序的数据存储中。

  16. 添加 SAP 云标识服务或下游目标 SAP 系统所需的任何其他映射。

  17. 选择“保存”按钮以提交任何更改。

    用户属性 类型 支持筛选 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 参考资料
  18. 若要配置范围筛选器,请参阅 范围筛选器文章 文章中提供的以下说明。

    保存预配配置的屏幕截图。

  19. 在组织中更广泛地部署之前,使用 按需预配 来验证与少数用户的同步。

  20. 准备好预配后,从“概述”页中选择“开始预配”。

将新的测试用户从Microsoft Entra ID预配到 SAP Cloud Identity Services

建议将单个新的Microsoft Entra测试用户分配到 SAP Cloud Identity Services 以测试自动用户预配配置。

  1. 以至少 Cloud 应用程序管理员和用户管理员身份登录到 Microsoft Entra 管理中心
  2. 浏览到 Entra ID>用户
  3. 选择“新建用户”“创建新用户”。
  4. 键入新测试用户的“用户主体名称”和“显示名称”。 用户主体名称必须是唯一的,并且与任何当前或以前的Microsoft Entra用户或 SAP Cloud Identity Services 用户不同。 依次选择“审阅+创建”和“创建”。
  5. 创建测试用户后,浏览到 Entra ID>Enterprise 应用
  6. 选择 SAP 云标识服务应用程序。
  7. 选择用户和组,然后选择添加用户/组
  8. 在“用户和组”中,选择“未选定”,并在文本框中键入测试用户的用户主体名称
  9. 选择选择,然后分配
  10. 选择预配,然后选择按需预配
  11. 在“选择用户或组”文本框中,键入测试用户的用户主体名称
  12. 选择“预配”
  13. 等待预配完成。 如果成功,则会看到消息 Modified attributes (successful)

您还可以选择验证当用户超出应用程序的范围时,Microsoft Entra 预配服务将预配哪些内容。

  1. 选择“用户和组” 。
  2. 选择测试用户,然后选择“删除”
  3. 删除测试用户后,选择“预配”,然后选择“按需预配”
  4. 在“选择用户或组”文本框中,键入刚取消分配的测试用户的用户主体名称
  5. 选择“预配”
  6. 等待预配完成。

最后,可以从Microsoft Entra ID中删除测试用户。

  1. 浏览到 Entra ID>用户
  2. 选择测试用户,选择“删除”,然后选择“确定”。 此操作将测试用户从 Microsoft Entra ID 中进行软删除。

然后,还可以从 SAP 云标识服务中删除测试用户。

确定应用程序中的现有用户并将其分配给企业应用程序

Microsoft Entra可以发现应用程序中的现有用户,并简化将其分配到企业应用程序。 单击预配总览页面中的 “发现身份” 按钮。 生成报表后,你将拥有应用程序中所有用户的视图,应用程序中的用户与Microsoft Entra ID用户匹配,哪些用户已分配到Microsoft Entra ID中的企业应用程序,并且应用程序中的用户与Microsoft Entra ID用户不匹配。 然后,可以运行简单的 PowerShell 脚本,将发现的用户分配到应用程序:

  1. 下载 CorrelatedUsers.ps1 文件。

  2. 为当前没有角色分配的用户创建应用程序角色分配(试运行):

    .\Assign-CorrelatedUsers.ps1 -ServicePrincipalId "7A22..." -DryRun
    
  3. 为当前没有角色分配的用户创建应用程序角色分配:

    .\Assign-CorrelatedUsers.ps1 -ServicePrincipalId "7A22..."
    
  4. 等待一分钟,以便在 Microsoft Entra ID 中传播更改。

发现功能需要 Entra ID Governance 许可证。 没有必要许可证的组织仍可按照以下步骤识别 SAP CLout 标识服务中的现有用户,并将其分配到Microsoft Entra中的企业应用程序。

确保现有 SAP 云标识服务用户具有必要的匹配属性

在将非测试用户分配给 Microsoft Entra ID 中的 SAP 云标识服务应用程序之前,应确保任何已在 SAP 云标识服务中存在且代表 Microsoft Entra ID 中的同一用户的用户均已在 SAP 云标识服务中填充了映射属性。

在预配映射中,选择为 Matching 属性的属性用于将Microsoft Entra ID中的用户帐户与 SAP Cloud Identity Services 中的用户帐户匹配。 如果 Microsoft Entra ID 中存在与 SAP 云标识服务中不匹配的用户,则 Microsoft Entra 预配服务将尝试创建新用户。 如果 SAP Cloud Identity Services 中存在一个与 Microsoft Entra ID 用户匹配的用户,则 Microsoft Entra 预配服务将更新该 SAP Cloud Identity Services 用户。 因此,您应该确保 SAP 云标识服务中已存在的任何用户的属性已被选择并填充为匹配属性,否则可能会创建重复用户。 如果需要更改Microsoft Entra应用程序属性映射中的匹配属性,请参阅匹配源系统和目标系统中的用户

  1. 登录到 SAP 云标识服务管理控制台 https://<tenantID>.accounts.ondemand.com/admin(如果是试用,则 https://<tenantID>.trial-accounts.ondemand.com/admin)。

  2. 导航到“用户和授权 > 导出用户”。

  3. 选择将 Microsoft Entra 用户与 SAP 中的用户匹配所需的所有特性。 这些属性包括 SCIM IDuserNameemails 以及可能在 SAP 系统中用作标识符的的其他属性。

  4. 选择“导出”并等待浏览器下载 CSV 文件。

  5. 打开 PowerShell 窗口。

  6. 在编辑器中键入以下脚本。 在第一行中,如果选择了 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."
    
  7. 运行该脚本。 脚本完成后,如果存在一个或多个缺少所需匹配属性的用户,请在导出的 CSV 文件或 SAP 云标识服务管理控制台中查找这些用户。 如果这些用户也存在于Microsoft Entra中,则需要先更新这些用户的 SAP Cloud Identity Services 表示形式,以便填充匹配的属性。

  8. 在 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 用于租户。 后续交互可以使用较低特权角色,例如:

  • 用户管理员(如果预计会创建新用户)。
  • 应用程序管理员或标识治理管理员(如果只是管理应用程序角色分配)。
  1. 打开 PowerShell。

  2. 如果尚未安装 Microsoft Graph PowerShell 模块,请使用以下命令安装 Microsoft.Graph.Users 模块和其他模块:

    Install-Module Microsoft.Graph
    

    如果已安装模块,请确保使用的是最新版本:

    Update-Module microsoft.graph.users,microsoft.graph.identity.governance,microsoft.graph.applications
    
  3. 连接到Microsoft Entra ID:

    $msg = Connect-MgGraph -ContextScope Process -Scopes "User.ReadWrite.All,Application.ReadWrite.All,AppRoleAssignment.ReadWrite.All,EntitlementManagement.ReadWrite.All"
    
  4. 如果这是你第一次使用此命令,则可能需要同意允许Microsoft Graph命令行工具具有这些权限。

  5. 将从应用程序数据存储中获取的用户列表读取到 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
    
  6. 选择users.csv文件中与Microsoft Entra ID用户属性相匹配的列。

    如果使用 SAP 云标识服务,则默认映射是 SAP SCIM 属性 userName 与 Microsoft Entra ID 属性 userPrincipalName

    $db_match_column_name = "userName"
    $azuread_match_attr_name = "userPrincipalName"
    

    另一个例子是,如果您使用数据库或目录,数据库中的用户可能有< c0 />命名的列中的值与 Microsoft Entra 属性中的值相同。

    $db_match_column_name = "EMail"
    $azuread_match_attr_name = "userPrincipalName"
    
  7. 检索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 }
    }
    
    
  8. 查看以前查询的结果。 请查看 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." 
    
  9. 脚本完成后,如果数据源中的任何记录未在 Microsoft Entra ID 中找到,它将指示错误。 如果无法在Microsoft Entra ID中匹配应用程序数据存储中的所有用户记录,则需要调查哪些记录不匹配以及原因。

    例如,某人的电子邮件地址和 userPrincipalName 可能在 Microsoft Entra ID 中被更改,但在应用程序的数据源中相应的 mail 属性没有被更新。 或者,用户可能已经离开了组织,但仍处于应用程序的数据源中。 或者,应用程序数据源中可能有一个供应商或超级管理员帐户,该帐户与Microsoft Entra ID中的任何特定人员不对应。

  10. 如果存在无法在 Microsoft Entra ID 中找到的用户,或者他们未激活或无法登录,但你希望在 SAP Cloud Identity Services、数据库或目录中审核他们的访问权限或更新他们的属性,则需要更新应用程序、匹配规则,或更新或为其创建 Microsoft Entra 用户。 有关要进行的更改的详细信息,请参阅管理应用程序中与 Microsoft Entra ID 中用户不匹配的映射和用户帐户

    如果选择在Microsoft Entra ID中创建用户的选项,则可以使用以下任一方法批量创建用户:

    确保使用 Microsoft Entra ID 所需的属性填充这些新用户,以便稍后将其与应用程序中的现有用户以及 Microsoft Entra ID 所需的属性(包括 userPrincipalNamemailNicknamedisplayName)匹配。 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 Cloud Identity Services、数据库或与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
       }
    }
    
  11. 将缺少的用户添加到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 Cloud Identity Services,然后需要检查以确保这些用户具有Microsoft Entra ID中所需的属性,并且这些属性映射到 SAP Cloud Identity Services 的预期架构。

  • 默认情况下,Microsoft Entra用户 userPrincipalName 属性的值映射到 SAP Cloud Identity Services 的 userNameemails[type eq "work"].value 属性。 如果用户的电子邮件地址与其用户主体名称不同,则可能需要更改此映射。
  • 如果公司 ZIP/邮政编码的格式与公司国家或地区不匹配,SAP Cloud Identity Services 可能会忽略属性的值 postalCode
  • 默认情况下,Microsoft Entra属性country映射到 SAP Cloud Identity Services addresses[type eq "work"].country 字段。 如果特性的值 country 不是两个字符 ISO 3166 国家/地区代码,则在 SAP Cloud Identity Services 中创建这些用户可能会失败。 有关详细信息,请参阅 countries.properties
  • 默认情况下,Microsoft Entra属性department映射到 SAP Cloud Identity Services urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:department 属性。 如果Microsoft Entra用户具有 department 属性的值,则这些值必须与 SAP Cloud Identity Services 中已配置的部门匹配,否则创建或更新用户将失败。 有关详细信息,请参阅 departments.properties。 如果Microsoft Entra用户中的 department 值与 SAP 环境中的值不一致,则更新 Microsoft Entra 中的部门值、更新 SAP Cloud Identity Services 中允许的部门值,或者在分配用户之前删除映射。
  • SAP 云标识服务的 SCIM 终结点要求某些属性采用特定格式。 可以 在此处详细了解这些属性及其特定格式。

将用户分配到 Microsoft Entra ID 中的 SAP Cloud Identity Services 应用程序

Microsoft Entra ID使用名为 assignments 的概念来确定哪些用户应接收对所选应用的访问权限。 在自动用户预配的上下文中,如果Scope的“设置”值为仅同步已分配的用户和组,则只有已分配到 Microsoft Entra ID 中该应用程序角色的用户和组会与 SAP Cloud Identity Services 同步。 如果将用户分配到 SAP 云标识服务,则必须在“分配”对话框中选择任何特定于应用程序的有效角色(如果可用)。 具有“默认访问权限” 角色的用户排除在预配之外。 目前,SAP 云标识服务的唯一可用角色是“用户”

如果为应用程序启用了预配,请在将更多用户分配到应用程序之前检查应用程序预配是否未处于 隔离 状态。 在继续之前,请解决导致隔离的所有问题。

检查 SAP Cloud Identity Services 中存在但尚未分配给 Microsoft Entra ID 中该应用程序的用户。

前面的步骤评估了 SAP Cloud Identity Services 中的用户是否也作为Microsoft Entra ID中的用户存在。 但是,它们可能并未在当前全部都分配给 Microsoft Entra ID 中的应用程序角色。 因此,后续步骤是查看哪些用户没有分配应用程序角色。

  1. 使用 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
    
  2. 检索当前已分配到 Microsoft Entra ID 中应用程序的用户。

    这建立在上一命令中设置的 $azuread_sp 变量的基础上。

    $azuread_existing_assignments = @(Get-MgServicePrincipalAppRoleAssignedTo -ServicePrincipalId $azuread_sp.Id -All)
    
  3. 将 SAP Cloud Identity Services 和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 中的一个或多个用户当前未分配给应用程序角色,则需要继续该过程并将其添加到应用程序角色之一。

  4. 选择应用程序服务主体的 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"}
    
  5. 为已在 SAP Cloud Identity Services 和 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
    }
    
  6. 等待一分钟,以便在 Microsoft Entra ID 中传播更改。

  7. 在下一个Microsoft Entra预配周期中,Microsoft Entra预配服务会将分配给应用程序的这些用户的表示形式与 SAP Cloud Identity Services 中的表示形式进行比较,并将 SAP Cloud Identity Services 用户更新为具有Microsoft Entra ID的属性。

分配剩余用户并监视初始同步

测试完成后,用户已成功预配到 SAP 云标识服务,并且任何现有的 SAP 云标识服务用户都已分配到应用程序角色,可以按照此处的其中一条说明,将任何其他授权用户分配给 SAP 云标识服务应用程序:

将用户分配到应用程序角色并处于预配范围后,Microsoft Entra预配服务会将这些用户预配到 SAP Cloud Identity Services。 请注意,初始同步的执行时间比后续同步要长,只要Microsoft Entra预配服务正在运行,大约每 40 分钟进行一次同步。

如果您未看到用户得到预配,请查看有关用户未预配的故障排除指南中的步骤。 然后,通过 Microsoft Entra 管理中心Graph API 检查预配日志。 按状态“失败”筛选日志。 如果失败并且 ErrorCode 为 DuplicateTargetEntries,则表示预配匹配规则存在歧义,你需要更新 Microsoft Entra 用户或用于匹配的映射,以确保每个 Microsoft Entra 用户匹配一个应用程序用户。 然后按操作“创建”和状态“已跳过”来筛选日志。 如果跳过的用户的 SkipReason 代码为 NotEffectivelyEntitled,则这可能表明 Microsoft Entra ID 中的用户帐户由于用户帐户状态为“已禁用”而不匹配。

配置单一登录

还可以选择按照 SAP Cloud Identity Services 单一登录文章中提供的说明为 SAP Cloud Identity Services 启用基于 SAML 的单一登录。 可独立于自动用户预配来配置单一登录,尽管这两个功能互相补充。

监视预配

可以使用 Synchronization Details 部分监视进度,并跟踪到预配活动报告的链接,其中描述了 Microsoft Entra 预配服务对 SAP 云身份服务执行的所有操作。 还可以通过 Microsoft Graph API 监视预配项目。

要详细了解如何读取 Microsoft Entra 预配日志,请参阅有关自动用户帐户预配的报告

维护应用程序角色分配

当已分配给该应用程序的用户在 Microsoft Entra ID 中更新时,这些更改将自动预配到 SAP Cloud Identity Services。

如果有Microsoft Entra ID 治理,则可以在Microsoft Entra ID中自动更改 SAP Cloud Identity Services 的应用程序角色分配,在人员加入组织时添加或删除分配,或者离开或更改角色。

更新 SAP Cloud Identity Services 应用以使用 SAP Cloud Identity Services 的 SCIM 2.0 接口

2025 年 9 月,Microsoft发布了适用于 SAP Cloud Identity Services 的 SCIM 2.0 连接器,该连接器添加了对 SAP Cloud Identity Services、自定义扩展属性和 OAuth 2.0 客户端凭据授予的组预配和取消预配的支持。

完成以下步骤将允许以前使用 SAP 云标识服务连接器的客户从 SCIM 1.0 终结点切换到 SCIM 2.0 终结点。

  1. 以至少 云应用程序管理员 的身份登录到 Microsoft Entra 管理中心

  2. 浏览到 Entra ID > 企业应用 > SAP Cloud Identity Services

  3. “属性” 部分中,复制对象 ID。

    SAP Cloud Identity Services 连接器的属性面板中可以复制对象 ID 的位置的屏幕截图。

  4. 在新的 Web 浏览器窗口中,转到 https://developer.microsoft.com/graph/graph-explorer,以管理员身份登录到应用所在的 Microsoft Entra 租户。

  5. 检查以确保所使用的帐户具有正确的权限。 进行此更改需要权限“Directory.ReadWrite.All”。

    Graph 资源管理器中“权限”屏幕的屏幕截图,其中管理员正在选择提供 Directory.ReadWrite.All 权限同意的选项。

  6. 使用之前从应用中选择的对象 ID,运行以下命令。

GET https://graph.microsoft.com/beta/servicePrincipals/[object-id]/synchronization/jobs/
  1. 从上一示例中请求的 GET 响应正文获取“ID”值,运行以下命令,将“[job-id]”替换为请求中的 GET ID 值。 该值的格式应为“sapcloudidentityservices.xxxxxxxxxxxxxxx.xxxxxxxxxxxxxxx”:
DELETE https://graph.microsoft.com/beta/servicePrincipals/[object-id]/synchronization/jobs/[job-id]
  1. 在Microsoft Graph资源管理器中,运行以下命令。 将“[object-id]”替换为从第三步复制的服务主体 ID(对象 ID)。
POST https://graph.microsoft.com/beta/servicePrincipals/[object-id]/synchronization/jobs { "templateId": "sapcloudidentityservices" }
  1. 返回到第一个 Web 浏览器窗口,然后选择应用程序的 “预配 ”选项卡。 配置将重置。 可以通过确认作业 ID 是否以“sapcloudidentityservices”开头,来判断升级是否成功。

  2. 管理员凭据部分中的租户 URL 更新为以下内容:如果是试用版,请使用https://<tenantID>.accounts.ondemand.com/scim,否则使用https://<tenantid>.trial-accounts.ondemand.com/service/scim

  3. 还原对应用程序所做的任何先前更改(身份验证详细信息、范围筛选器、自定义属性映射)并重新启用预配。

注意

未能恢复之前的设置可能会导致属性(例如 name.formatted)在 SAP Cloud Identity Services 中意外更新。 在启用预配之前,请务必检查配置。

Changelog

  • 2025 年 9 月 30 日 - 正式发布使用 SCIM 2.0 终结点的 SAP 云标识服务连接器的新版本。 新版本支持 SAP Cloud Identity Services 的组配置和取消配置、自定义扩展属性,以及 OAuth 2.0 客户端凭据授权。

更多资源