何时使用“以声明方式发送 LDAP 属性”规则

如果要发出包含属性存储中实际轻型目录访问协议(LDAP)属性值的传出声明,然后将声明类型与每个 LDAP 属性相关联,则可以在 Active Directory 联合身份验证服务(AD FS)中使用此规则。 有关属性存储的详细信息,请参阅 属性存储的角色

使用此规则时,请针对指定的每个 LDAP 属性发出声明,该属性与规则逻辑匹配,如下表所述。

规则选项 规则逻辑
LDAP 属性到传出声明类型的映射 如果属性 存储等于指定的属性存储和 LDAP 属性等于 指定值,则将 LDAP 属性值映射到 指定的传出声明 类型并发出声明。

以下各节提供声明规则的基本简介。 他们还提供有关何时使用发送 LDAP 属性作为声明规则的详细信息。

关于声明规则

声明规则表示使用传入声明、向其应用条件 (if x, then y) 并基于条件参数生成传出声明的业务逻辑的实例。 下面的列表概述了在进一步阅读本主题中的内容之前应了解的有关声明规则的重要提示:

  • 在“AD FS 管理”管理单元中,只能使用声明规则模板创建声明规则

  • 声明规则处理以下两种传入声明:直接来自声明提供程序(如 Active Directory 或另一个联合身份验证服务),或来自声明提供程序信任上的接受转换规则的输出。

  • 声明规则由声明颁发引擎按给定规则集内的时间顺序处理。 通过为规则设置优先级,可以进一步优化或筛选由给定规则集内以前的规则生成的声明。

  • 声明规则模板始终要求你指定传入声明类型。 但是,你可以使用单个规则处理声明类型相同的多个声明值。

有关声明规则和声明规则集的更多详细信息,请参阅 声明规则的角色。 有关如何处理规则的详细信息,请参阅 声明引擎的角色。 有关如何处理声明规则集的详细信息,请参阅 声明管道的角色

LDAP 属性到传出声明类型的映射

使用“发送 LDAP 属性”作为声明规则模板时,可以从 LDAP 属性存储(例如 Active Directory 或 Active Directory 域服务(AD DS)中选择属性,以将其值作为声明发送到信赖方。 这实质上是将特定 LDAP 属性从定义的属性存储映射到一组可用于授权的传出声明。

使用此模板,可以添加多个属性,这些属性将作为多个声明从单个规则发送。 例如,可以使用此规则模板创建一个规则,该规则将查找公司和部门 Active Directory 属性中经过身份验证的用户的属性值,然后将这些值作为两个不同的传出声明发送。

还可以使用此规则发送用户的所有组成员身份。 如果只想发送单个组成员身份,请使用“发送组成员身份”作为声明规则模板。 有关详细信息,请参阅 “何时使用发送组成员身份作为声明规则”。

如何创建此规则

可以使用声明规则语言或使用 AD FS 管理工具中的“发送 LDAP 属性作为声明的规则模板”来创建此规则。 此规则模板提供以下配置选项:

  • 指定声明规则名称

  • 选择要从中提取 LDAP 属性的属性存储

  • LDAP 属性到传出声明类型的映射

有关如何创建此规则的详细信息,请参阅 创建规则以将 LDAP 属性作为声明发送

使用声明规则语言

如果对 Active Directory、AD DS 或 Active Directory 轻型目录服务(AD LDS)的查询必须与 samAccountname 以外的 LDAP 属性进行比较,则必须改用自定义规则。 如果输入集中没有 Windows 帐户名称声明,则还必须使用自定义规则指定要用于查询 AD DS 或 AD LDS 的声明。

以下示例旨在帮助你了解一些可以使用声明规则语言来查询和提取属性存储中的数据的自定义规则的各种方法。

示例:如何查询 AD LDS 属性存储并返回指定值

参数必须用分号分隔。 第一个参数是 LDAP 筛选器。 后续参数是在任何匹配对象上返回的属性。

以下示例演示如何使用用户的邮件属性的值通过 sAMAccountName 属性查找用户并发出电子邮件地址声明:

c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"]
=> issue(store = "AD LDS", types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"), query = "sAMAccountName={0};mail", param = regexreplace(c.Value, "(?<___domain>[^\\]+)\\(?<user>.+)", "${user}"));

以下示例演示如何通过 邮件 属性查找用户,并使用用户的标题和显示名称属性的值发出 标题显示名称 声明:

c:[Type == " http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress ", Issuer == "AD AUTHORITY"]
=> issue(store = "AD LDS ", types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/title","http://schemas.xmlsoap.org/ws/2005/05/identity/claims/displayname"), query = "mail={0};title;displayname", param = c.Value);

以下示例演示如何通过邮件和标题查找用户,然后使用用户的 displayname 属性发出显示名称 声明:

c1:[Type == " http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"] && c2:[Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/title"]
=> issue(store = "AD LDS ", types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/displayname"), query = "(&(mail={0})(title={1}));displayname", param = c1.Value, param = c2.Value);

示例:如何查询 Active Directory 属性存储并返回指定值

Active Directory 查询必须包含用户名(域名)作为最终参数,以便 Active Directory 属性存储可以查询正确的域。 支持相同的语法,除非另有说明。

以下示例演示如何在其域中按 sAMAccountName 属性查找用户,然后返回 邮件 属性:

c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"]
=> issue(store = "Active Directory", types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"), query = "sAMAccountName={0};mail;{1}", param = regexreplace(c.Value, "(?<___domain>[^\\]+)\\(?<user>.+)", "${user}"), param = c.Value);

示例:如何根据传入声明的值查询 Active Directory 属性存储

c:[Type == "http://test/name"]

   => issue(store = "Enterprise AD Attribute Store",

         types = ("http://test/email"),

         query = ";mail;{0}",

         param = c.Value)

上一个查询由以下三个部分组成:

  • LDAP 筛选器 - 您指定此查询部分以检索要查询其属性的对象。 有关有效 LDAP 查询的一般信息,请参阅 RFC 2254。 在查询 Active Directory 属性存储并且未指定 LDAP 筛选器时,假定 samAccountName={0} 查询,并且 Active Directory 属性存储需要一个可以为其提供值 {0}的参数。 否则,查询将导致错误。 对于 Active Directory 以外的 LDAP 属性存储,不能省略查询的 LDAP 筛选器部分,否则查询将导致错误。

  • 属性规范 - 在查询的第二部分,您可以指定从筛选后的对象中提取的属性(如果有多个属性值,则用逗号分隔)。 指定的属性数必须与在查询中定义的声明类型数匹配。

  • Active Directory 域 - 仅当属性存储为 Active Directory 时,才指定查询的最后一部分。 (查询其他属性存储时不需要它。)查询的此部分用于采用“域\名称”形式指定用户帐户。 Active Directory 属性存储使用域部件来确定相应的域控制器,以便连接到查询并请求属性。

示例:如何使用两个自定义规则从 Active Directory 中的属性中提取管理器电子邮件

以下两个自定义规则在如下所示的顺序一起使用时,请查询 Active Directory 以获取用户帐户(规则 1)的 管理器 属性,然后使用该属性查询经理的用户帐户以获取 邮件 属性(规则 2)。 最后,mail 属性作为“ManagerEmail”声明被发布。 总之,规则 1 查询 Active Directory 并将查询结果传递给规则 2,然后提取管理器电子邮件值。

例如,当这些规则完成运行时,会发出一个声明,其中包含 corp.fabrikam.com 域中用户的经理电子邮件地址。

规则 1

c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname"]
=> add(store = "Active Directory", types = ("http://schemas.xmlsoap.org/claims/ManagerDistinguishedName"), query = "sAMAccountName=
{0};mail,userPrincipalName,extensionAttribute5,manager,department,extensionAttribute2,cn;{1}", param = regexreplace(c.Value, "(?
<___domain>[^\\]+)\\(?<user>.+)", "${user}"), param = c.Value);

规则 2

c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname"]
&& c1:[Type == "http://schemas.xmlsoap.org/claims/ManagerDistinguishedName"]
=> issue(store = "Active Directory", types = ("http://schemas.xmlsoap.org/claims/ManagerEmail"), query = "distinguishedName={0};mail;{1}", param = c1.Value,
param = regexreplace(c1.Value, ".*DC=(?<___domain>.+),DC=corp,DC=fabrikam,DC=com", "${___domain}\username"));

注释

仅当用户的经理与用户位于同一域中(本示例中 corp.fabrikam.com)时,这些规则才起作用。

其他参考

创建规则以将 LDAP 属性作为声明发送