增强的新式验证人员选取器

适用于:no-img-132013 no-img-162016 no-img-192019 yes-img-seSubscription Edition no-img-sopSharePoint in Microsoft 365

使用新式 (“受信任的标识提供者”) 身份验证,例如安全断言标记语言 (SAML) 1.1 或 OpenID Connect (OIDC) 1.0 时,人员选取器控件无法搜索、解析和验证用户和组。 相反,默认行为是解析输入的任何值,即使它不是有效的声明。 在早期版本的 SharePoint Server 中,唯一的解决方案是使用自定义声明提供程序。

在 SharePoint Server 订阅版 (SPSE) 中,人员选取器已得到增强,允许根据用户配置文件应用程序 (UPA(又名:UPSA) )中的配置文件解析用户和组。 必须将 UPA 配置为从受信任的标识提供者成员身份存储同步用户和组。 这允许人员选取器解析有效的用户和组,而无需自定义声明提供程序。

注意

在 SharePoint Server 订阅版本中使用自定义声明提供程序仍然是人员选取器问题的有效解决方案。 如果本文中讨论的 UPA 支持的声明提供程序的限制对组织来说太有限,请参阅 在 SharePoint 中创建声明提供程序

重要

SharePoint Server 附带的默认用户配置文件导入引擎(称为“Active Directory 导入” (AD 导入) )只能用于从本地 Active Directory 域和林导入用户配置文件。 无法将其配置为从 entra ID Microsoft导入用户配置文件。 如果使用由 Entra ID 提供支持的 OIDC 身份验证,则可以考虑使用自定义声明提供程序来提供人员选取器功能。

下面是使 UPA 支持的人员选取器正常工作的配置步骤。

步骤 1:将 UPA-Backed 声明提供程序添加到 SPTrustedIdentityTokenIssuer

注意

对于 SAML 1.1 受信任的标识令牌颁发者,可以在创建令牌颁发者时添加 UPA 支持的声明提供程序,也可以稍后分配一个。
对于 OIDC 1.0 受信任的标识令牌颁发者,必须先创建令牌颁发者,然后才能分配声明提供程序。 请参阅 将 UPA 支持的声明提供程序添加到现有 SPTrustedIdentityTokenIssuer

创建新的 SPTrustedIdentityTokenIssuer 并同时分配 UPA 支持的声明提供程序

注意

这仅适用于 SAML 1.1 受信任的标识令牌颁发者。

使用 New-SPTrustedIdentityTokenIssuer PowerShell cmdlet 创建新的令牌颁发者,并通过添加 UseUPABackedClaimProvider 开关来分配声明提供程序。

New-SPTrustedIdentityTokenIssuer
    -ClaimsMappings <SPClaimMappingPipeBind[]> 
    -Description <String> 
    -IdentifierClaim <String> 
    -Name <String>
    -Realm <String> 
    -SignInUrl <String> 
    [-AssignmentCollection <SPAssignmentCollection>]
    -ImportTrustCertificate <X509Certificate2>
    [-UseWReply]
    [-Confirm] [-RegisteredIssuerName <String>]
    [-SignOutUrl <String>] 
    [-WhatIf] [<CommonParameters>]
    [-UseUPABackedClaimProvider]

以下三个参数需要特别注意:

  • ClaimsMappings
    ClaimsMappings 指定声明从原始令牌到 SharePoint 令牌的映射。 通过使用此参数,SharePoint 了解如何在从用户配置文件服务应用程序属性给定特定令牌时生成 SharePoint 令牌。
    它接受对象列表 ClaimTypeMapping ,这些对象由 New-SPClaimTypeMapping cmdlet 创建。 下面是不同类型的令牌的对象的示例 ClaimTypeMapping ,这些对象可以提供给 ClaimsMappings 参数:
$emailClaimMap = New-SPClaimTypeMapping -IncomingClaimType "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress" -IncomingClaimTypeDisplayName "EmailAddress" -SameAsIncoming
$upnClaimMap = New-SPClaimTypeMapping -IncomingClaimType "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn" -IncomingClaimTypeDisplayName "UPN" -SameAsIncoming
$roleClaimMap = New-SPClaimTypeMapping -IncomingClaimType "http://schemas.microsoft.com/ws/2008/06/identity/claims/role" -IncomingClaimTypeDisplayName "Role" -SameAsIncoming
$sidClaimMap = New-SPClaimTypeMapping -IncomingClaimType "http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid" -IncomingClaimTypeDisplayName "SID" -SameAsIncoming
  • IdentifierClaim
    参数 IdentifierClaim 指定将用作标识符声明的声明类型 (通常为电子邮件或 UPN) 。 它可以设置为InputClaimTypeClaimTypeMappingNew-SPClaimTypeMapping cmdlet 创建的 对象的 。
-IdentifierClaim $emailClaimMap.InputClaimType
  • UseUPABackedClaimProvider
    此 switch 参数使人员选取器能够搜索和选择用户配置文件应用程序服务中的用户和组。 它还会创建一个 SPClaimProvider,其名称 SPTrustedIdentityTokenIssuer与 相同。

注意

“UseUPABackedClaimProvider”参数不能用于创建 OIDC SPTrustedIdentityTokenIssuer。 它只能用于创建 SAML SPTrustedIdentityTokenIssuer。

示例:

# Create a new trusted identity token issuer, and assign a UPA-backed claim provider at the same time
New-SPTrustedIdentityTokenIssuer -Name "UPATest" -Description "Contoso.local" -ClaimsMappings $emailClaimMap -IdentifierClaim $emailClaimMap.InputClaimType -UseUPABackedClaimProvider

将 UPA 支持的声明提供程序添加到现有 SPTrustedIdentityTokenIssuer

上面的示例演示了如何在创建仅) SAML 提供程序的受信任标识令牌颁发者 (时分配 UPA 支持的声明提供程序。 如果现有受信任的标识令牌颁发者 (SAML 或 OIDC) ,并且想要向其添加 UPA 支持的声明提供程序,请使用以下示例。

注意

以下 PowerShell 脚本示例在 SAML 1.1 和 OIDC 1.0 身份验证提供程序之间略有不同。 请选择正确的示例。

SAML 示例

# Get the existing trusted identity token issuer named "SAML"
$stsidp = Get-SPTrustedIdentityTokenIssuer "SAML"

# Create the new UPA-backed claim provider 
$claimprovider = New-SPClaimProvider -AssemblyName "Microsoft.SharePoint, Version=16.0.0.0, Culture=neutral, publicKeyToken=71e9bce111e9429c"  -Description "UPA-Backed" -DisplayName "UPA-Backed Claim Provider" -Type "Microsoft.SharePoint.Administration.Claims.SPTrustedBackedByUPAClaimProvider" -TrustedTokenIssuer $stsidp

# Set the trusted identity token issuer to use the new claim provider
Set-SPTrustedIdentityTokenIssuer $stsidp -ClaimProvider $claimprovider

OIDC 的示例

# Get the existing trusted identity token issuer named "OIDC"
$stsidp = Get-SPTrustedIdentityTokenIssuer "OIDC"

# Create the new UPA-backed claim provider 
$claimprovider = New-SPClaimProvider -AssemblyName "Microsoft.SharePoint, Version=16.0.0.0, Culture=neutral, publicKeyToken=71e9bce111e9429c"  -Description "UPA-Backed" -DisplayName "UPA-Backed Claim Provider" -Type "Microsoft.SharePoint.Administration.Claims.SPTrustedBackedByUPAClaimProvider" -TrustedTokenIssuer $stsidp

# Set the trusted identity token issuer to use the new claim provider
Set-SPTrustedIdentityTokenIssuer $stsidp -ClaimProvider $claimprovider -IsOpenIDConnect

步骤 2:将配置文件同步到 UPSA

现在可以开始将用户配置文件同步到 SharePoint 用户配置文件服务应用程序 (UPSA) ,以便新创建的声明提供程序可以处理正确的数据集。

以下是将用户配置文件同步到 SharePoint 用户配置文件服务应用程序的两种方法:

  • 将 SharePoint Active Directory 导入 (AD 导入) 与 受信任的声明提供程序身份验证 结合使用,作为同步连接设置中的 身份验证提供程序类型 。 若要使用 AD 导入,请参阅 在 SharePoint Server 中管理用户配置文件同步

    添加新的同步连接。

    重要

    AD 导入只能用于从本地 Active Directory 域和林导入用户配置文件。 无法将其配置为从 Entra ID 导入配置文件。 如果使用由 Entra ID 提供支持的 OIDC 身份验证,可以改为考虑使用自定义声明提供程序来提供人员选取器功能。

  • 使用 Microsoft Identity Manager (MIM) 。 若要使用 MIM,请参阅 SharePoint Server 2016 和 2019 中的 Microsoft Identity Manager

  • 设置 MIM 后,MIM 同步管理器 UX 中应有两个代理。 一个代理用于将用户配置文件从源 IDP 导入到 MIM 数据库。 另一个代理用于将用户配置文件从 MIM 数据库导出到 SharePoint 用户配置文件服务应用程序。

在同步期间,向 User Profile 服务应用程序提供以下属性:

a. SPS-ClaimID

  • 在源中选择唯一标识属性,该属性将映射到 User Profile 服务应用程序中的 SPS-ClaimID 属性, (首选 电子邮件用户主体名称) 。
  • 当使用 New-SPTrustedIdentityTokenIssuer cmdlet 创建受信任的标识令牌颁发者时,此值应为相应的 IdentifierClaim 参数的值。

对于 AD 导入同步, 管理中心 -> 应用程序管理 -> 管理服务应用程序 -> 用户配置文件服务应用程序 -> 管理用户属性 UX 将允许管理员编辑 SPS-ClaimID 属性,以指示源标识提供者中的哪个属性应同步到 SPS-ClaimID。 这应该是用作受信任标识令牌颁发者中的标识符声明的属性。 例如,如果标识符声明是电子邮件,并且用户电子邮件地址存储在 Active Directory 的“mail”属性中,则在此 UX 中将“声明用户标识符”设置为“邮件”。

注意

SPS-ClaimID 的显示名称是 UX 中的声明用户标识符,管理员可以自定义显示名称。

如果不确定标识符声明,可以通过运行以下 PowerShell 进行检查: $trust = Get-SPTrustedIdentityTokenIssuer$trust.IdentityClaimTypeInformation

声明用户标识符。

属性设置。

同步的属性映射。

对于 MIM 同步,请将标识符声明 (通常 为电子邮件用户主体名称) 映射到 MIM 数据库中的 SPS-ClaimID ,映射到 SharePoint 用户配置文件服务应用程序代理:

  • 在 MIM 同步服务管理器中,选择代理并打开 “配置属性流 UX”。 可以将 邮件 映射到 SPS-ClaimID

    生成属性流。

b. SPS-ClaimProviderID 和 SPS-ClaimProviderType

注意

对于 AD 导入同步,只需更新“声明用户标识符” (SPS-ClaimID) 属性映射。 与 MIM 同步不同,不需要将“声明提供程序标识符” (SPS-ClaimProviderID) 和“声明提供程序类型” (SPS-ClaimProviderType) 映射。

对于 MIM 同步,请在为 MIM 数据库 配置属性流 UX 中将这两个属性设置为 SharePoint 用户配置文件服务应用程序代理:

  • SPS-ClaimProviderType 设置为 “受信任 ”作为常量类型。

  • 使用 New-SPTrustedIdentityTokenIssuer cmdlet 将 SPS-ClaimProviderID 设置为提供程序名称。

    配置属性流。

步骤 3:使组可搜索

重要

仅当使用组安全标识符 (SID) 且组已导入 User Profile Service 应用程序中时,才能使用 UPA 支持的声明提供程序解析安全组。
如果使用由 Entra ID 提供支持的 OIDC 身份验证,请注意,仅限云的组没有 SID,AD 导入也不能与 Entra ID 同步。
如果需要在 SharePoint 网站权限中使用仅限云的用户或组,则自定义声明提供程序可能是唯一的解决方案。

若要使人员选取器控件能够使用安全组,请完成以下步骤:

  1. 确保 Group 对象在标识提供者中具有 groupid 类型的名为 SID 的属性。
    如果还没有“groupSID”的声明映射,可以使用 New-SPClaimTypeMapping 创建对象ClaimTypeMapping,然后将此对象提供给具有 参数的 New-SPTrustedIdentityTokenIssuer cmdlet-ClaimsMappings

示例:

# Add Group SID as a claim type to an existing trusted provider named "SAML"
$Trust = Get-SPTrustedIdentityTokenIssuer -Identity "SAML"
$Trust.ClaimTypes.Add("http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid")
$Trust.Update()

# Add a claim mapping for Group SID
$GroupSidClaimMap = New-SPClaimTypeMapping -IncomingClaimType "http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid" -IncomingClaimTypeDisplayName "Group SID" -SameAsIncoming
$Trust = Get-SPTrustedIdentityTokenIssuer "SAML"
Add-SPClaimTypeMapping –TrustedIdentityTokenIssuer $Trust -Identity $GroupSidClaimMaps
  1. 将标识提供者中的组 的 SID 属性同步到用户配置文件服务应用程序中的 SID 属性。

    • 对于 AD 导入同步,SID 属性将自动从源标识提供者同步到 SharePoint 用户配置文件服务应用程序。

    • 对于 MIM 同步,请将属性从标识提供者映射到 MIM,然后从 MIM 映射到 SharePoint 用户配置文件服务应用程序,以便 MIM 可以将组 SID 从标识提供者同步到 SharePoint 用户配置文件服务应用程序。 这些步骤类似于为用户配置文件映射 SPS-ClaimID 属性的方式,仅在这种情况下,更新“group”对象类型的映射。

      注意

      对于 MIM 同步,还要将 组对象的 sAMAccountName 映射到从 MIM 到 SharePoint 用户配置文件服务应用程序的 accountName

步骤 4:将属性设置为 UPSA 中的可搜索

若要使人员选取器正常工作,最后一步是在用户配置文件服务应用程序中启用可搜索的属性。

管理员可以按照此示例 PowerShell 脚本设置人员选取器搜索的属性。

# Get the UPA property list
$site = $(Get-SPWebApplication $WebApplicationName).Sites[0]
$context = Get-SPServiceContext $site
$psm = [Microsoft.Office.Server.UserProfiles.ProfileSubTypeManager]::Get($context)
$ps = $psm.GetProfileSubtype([Microsoft.Office.Server.UserProfiles.ProfileSubtypeManager]::GetDefaultProfileName([Microsoft.Office.Server.UserProfiles.ProfileType]::User))
$properties = $ps.Properties

# Set the proerties defined in $PropertyNames as searchable. 
# In this example, we set First Name, Last Name, claim ID, email address, and PreferredName as searchable for the People Picker.
$PropertyNames = 'FirstName', 'LastName', 'SPS-ClaimID', 'WorkEmail', 'PreferredName'
foreach ($p in $PropertyNames) {
    $property = $properties.GetPropertyByName($p)
    if ($property) {
        $property.CoreProperty.IsPeoplePickerSearchable = $true
        $property.CoreProperty.Commit()
        $property.Commit()
    }
}

若要检查哪些 UPSA 属性已启用人员选取器搜索,可以使用以下 PowerShell 示例:

# Get the UPA property list
$site = $(Get-SPWebApplication $WebApplicationName).Sites[0]
$context = Get-SPServiceContext $site
$psm = [Microsoft.Office.Server.UserProfiles.ProfileSubTypeManager]::Get($context)
$ps = $psm.GetProfileSubtype([Microsoft.Office.Server.UserProfiles.ProfileSubtypeManager]::GetDefaultProfileName([Microsoft.Office.Server.UserProfiles.ProfileType]::User))
$properties = $ps.Properties

# Set the proerties defined in $PropertyNames as searchable. 
# In this example, we set First Name, Last Name, claim ID, email address, and PreferredName as searchable for the People Picker.
$PropertyNames = 'FirstName', 'LastName', 'SPS-ClaimID', 'WorkEmail', 'PreferredName'
foreach ($p in $PropertyNames) {
    $property = $properties.GetPropertyByName($p)
    if ($property) {
        $property.CoreProperty.IsPeoplePickerSearchable = $true
        $property.CoreProperty.Commit()
        $property.Commit()
    }
}