教程:配置 SAP 云标识服务以实现自动用户预配

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

注意

本教程介绍在 Microsoft Entra 用户预配服务中构建的连接器。 有关此服务的功能、工作原理以及常见问题的重要详细信息,请参阅使用 Microsoft Entra ID 自动将用户预配到 SaaS 应用程序和取消预配。 SAP 云标识服务也有自己的单独连接器,用于从 Microsoft Entra ID 读取用户和组。 有关详细信息,请参阅 SAP 云标识服务 - 标识预配 - Microsoft Entra ID 作为源系统

先决条件

本教程中概述的方案假定你已具有以下先决条件:

注意

此集成也可以通过 Microsoft Entra 美国政府云环境使用。 可以在“Microsoft Entra 美国政府云应用程序库”中找到此应用程序,并以与公有云环境相同的方式对其进行配置。

如果 Microsoft Entra ID 中尚不存在用户,请从规划部署 Microsoft Entra 以通过 SAP 源和目标应用进行用户预配教程开始。 此教程演示如何将 Microsoft Entra 与组织中辅助角色列表的权威来源(例如 SAP SuccessFactors)连接起来。 教程中还演示了如何使用 Microsoft Entra 为这些辅助角色设置身份,以便其能够登录一个或多个 SAP 应用程序(例如 SAP ECC 或 SAP S/4HANA)。

如果要在生产环境中配置 SAP 云标识服务中的预配,然后在此环境中使用 Microsoft Entra ID Governance 来治理对 SAP 工作负载的访问,则在继续操作之前,请先查看为标识治理配置 Microsoft Entra ID 之前的先决条件

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

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

    SAP 云标识服务管理控制台的屏幕截图。

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

    注意

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

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

    SAP 云标识服务“添加 SCIM”的屏幕截图。

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

  5. 复制 SAP 生成的客户端 ID 和客户端密码。 这些值将分别输入到“管理员用户名”和“管理员密码”字段中。 这是在 SAP 云标识服务应用程序的“预配”选项卡中完成的,将在下一部分进行设置。

  6. SAP 云标识服务可映射到一个或多个 SAP 应用程序作为目标系统。 检查用户上是否有通过 SAP 云标识服务预配这些 SAP 应用程序所需的任何属性。 本教程假定 SAP 云标识服务和下游目标系统需要两个属性 - userNameemails[type eq "work"].value。 如果 SAP 目标系统需要其他属性,并且这些属性不是 Microsoft Entra ID 用户架构的一部分,那么可能需要配置同步扩展属性

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

如果 SAP 云标识服务已配置为从 Microsoft Entra 进行单一登录,并且企业应用程序的 Microsoft Entra 列表中已存在应用程序,那么请继续下一部分。

若要使用 Microsoft Entra 管理中心添加 Microsoft Entra 应用程序库中的 SAP 云标识服务,请执行以下步骤

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

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

本部分将引导你完成配置 Microsoft Entra 预配服务的步骤,以便根据对 Microsoft Entra ID 中应用程序的用户分配,在 SAP 云标识服务中创建、更新和禁用用户。

要在 Microsoft Entra ID 中为 SAP 云标识服务配置自动用户预配,请执行以下操作:

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

  2. 浏览到“标识”>“应用程序”>“企业应用程序”

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

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

    应用程序列表中 SAP 云标识服务链接的屏幕截图。

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

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

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

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

  7. 将“预配模式”设置为“自动”。

    “预配模式”下拉列表的屏幕截图,其中突出显示了“自动”选项。

  8. 在“管理员凭据”部分下,输入 https://<tenantID>.accounts.ondemand.com/service/scim(如果是试用版,则输入 https://<tenantid>.trial-accounts.ondemand.com/service/scim),并在“租户 URL”中输入 SAP 云标识服务的租户 ID。 输入之前分别在“管理员用户名”和“管理员密码”中检索的“客户端 ID”和“客户端密码”值。 单击“测试连接”,以确保 Microsoft Entra ID 可以连接到 SAP 云标识服务。 如果连接失败,请确保 SAP 云标识服务系统帐户具有管理员权限,密码仍然有效,然后重试。

    租户 URL 和令牌的屏幕截图。

  9. 在“通知电子邮件”字段中,输入应接收预配错误通知的个人或组的电子邮件地址,并选中复选框“发生故障时发送电子邮件通知” 。

    “通知电子邮件”的屏幕截图。

  10. 单击“ 保存”。

  11. 在“映射”部分下,选择“预配 Microsoft Entra ID 用户”

    SAP 云标识服务用户映射的屏幕截图。

  12. 在“属性映射”部分,查看从 Microsoft Entra ID 同步到 SAP 云标识服务的用户属性。 如果在 SAP 云标识服务中没有看到可用作映射目标的属性,则选择“显示高级选项”,然后选择“编辑 SAP Cloud Platform Identity Authentication 服务的属性列表”来编辑受支持的属性列表 添加 SAP 云标识服务租户的属性。

  13. 查看并记录已选择为匹配属性的源属性和目标属性、具有匹配优先级的映射,因为这些属性用于匹配 Microsoft Entra 预配服务的 SAP 云标识服务中的用户帐户,以确定是创建新用户还是更新现有用户。 有关匹配的详细信息,请参阅匹配源系统和目标系统中的用户。 在后续步骤中,将确保 SAP 云标识服务中已存在的任何用户选择的属性都是已填充的匹配属性,以防止创建重复用户

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

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

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

    Attribute 类型 支持筛选 SAP 云标识服务必需
    userName 字符串
    emails[type eq "work"].value String
    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 字符串
  17. 若要配置范围筛选器,请参阅范围筛选器教程中提供的以下说明。

  18. 要为 SAP 云标识服务启用 Microsoft Entra 预配服务,请在“设置”部分将“预配状态”更改为“”。

    “预配状态”切换为“开”的屏幕截图。

  19. 对于“设置”部分中“范围”的值,请选择“仅同步已分配的用户和组”

    预配范围的屏幕截图。

  20. 在已准备好预配时,请单击“保存”。

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

此操作会对“设置”部分的“范围”中定义的所有用户启动初始同步 。 如果将范围设置为“仅同步已分配的用户和组”,但没有为应用程序分配用户或组,则在将用户分配到应用程序之前不会进行同步

将新的测试用户从 Microsoft Entra ID 预配到 SAP 云标识服务

建议将单个新的 Microsoft Entra 测试用户分配到 SAP 云标识服务,以测试自动用户预配配置。

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

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

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

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

  1. 浏览到“标识”>“用户”>“所有用户”。
  2. 选择测试用户,选择“删除”,然后选择“确定”。 此操作会从 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 应用程序属性映射中的匹配属性,请参阅匹配源系统和目标系统中的用户

  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 does not 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 does not 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 云标识服务表示形式,使其填充了匹配属性。

  8. 在 SAP 云标识服务中更新这些用户的属性后,请从 SAP 云标识服务重新导出用户(如本部分中的步骤 2-5 和 PowerShell 步骤中所述),以确认 SAP 云标识服务中没有用户缺少匹配属性,否则会阻碍预配到这些用户。

你已获得从 SAP 云标识服务获取的所有用户的列表,现在会将应用程序数据存储中的这些用户与 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. 选择与 Microsoft Entra ID 用户属性匹配的 users.csv 文件的列。

    如果使用 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"
    
  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 中作为用户找到,则需要调查哪些记录不匹配以及原因。

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

  10. 如果存在无法在 Microsoft Entra ID 中找到的用户,或有用户未处于活动状态并且能够登录,但你想要审查其权限或在 SAP 云标识服务、数据库或目录中更新其属性,则需要更新应用程序、匹配规则,或为其更新或创建 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 云标识服务、数据库或目录中与 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 云标识服务,然后需要检查以确保这些用户在 Microsoft Entra ID 中具有必要的属性,并且这些属性已映射到 SAP 云标识服务的预期架构。

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

在 Microsoft Entra ID 中将用户分配到 SAP 云标识服务应用程序

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

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

检查 SAP 云标识服务中是否存在尚未分配给 Microsoft Entra ID 中的应用程序的用户

前面的步骤评估了 SAP 云标识服务中的用户是否也作为 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 云标识服务和 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 are not assigned to the application roles."
    

    如果没有用户未分配到应用程序角色,则表示所有用户都已分配到应用程序角色,表明 Microsoft Entra ID 和 SAP 云标识服务中没有共同的用户,因此无需更改。 但是,如果 SAP 云标识服务中的一个或多个用户当前未分配到应用程序角色,则需要继续执行该过程,将它们添加到其中一个应用程序角色。

  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 云标识服务和 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 云标识服务中的表示形式进行比较,并将 SAP 云标识服务用户更新为具有 Microsoft Entra ID 的属性。

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

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

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

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

配置单一登录

还可选择按照 SAP 云标识服务单一登录教程中提供的说明为 SAP 云标识服务启用基于 SAML 的单一登录。 可独立于自动用户预配来配置单一登录,尽管这两个功能互相补充。

监视预配

可使用“同步详细信息”部分监视进度并跟踪指向预配活动报告的链接,这描述了 Microsoft Entra 预配服务对 SAP 云标识服务执行的所有操作。 还可以通过 Microsoft 图形 API 监视预配项目。

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

维护应用程序角色分配

在 Microsoft Entra ID 中更新分配给应用程序的用户时,这些更改将自动预配到 SAP 云标识服务。

如果有 Microsoft Entra ID Governance,则可以自动更改 Microsoft Entra ID 中 SAP 云标识服务的应用程序角色分配,以便在人员加入组织、离开或更改角色时添加或删除分配。

更多资源

后续步骤