何时使用转换声明规则

如果需要将传入声明类型映射到传出声明类型,然后应用一个操作,该操作将基于传入声明中的值来确定应发生的输出,则可以在 Active Directory 联合身份验证服务 (AD FS) 中使用此规则。 使用此规则时,会根据规则中配置的选项之一传递或转换与以下规则逻辑匹配的声明,如下表所述。

规则选项 规则逻辑
传递所有传入声明 如果传入声明类型等于 指定的声明类型和 值等于 任何值,则通过传出声明类型等于 指定的声明类型传递声明
将传入声明值替换为不同的传出声明值 如果传入声明类型等于指定的声明类型和值等于指定的声明值,则使用新的传出声明值指定声明值和传出声明类型指定的声明类型转换声明
将传入电子邮件后缀声明替换为新的电子邮件后缀 如果传入声明类型等于指定的声明类型,且值等于任何后缀值,则将声明转换为具有新的传出声明值指定后缀值和传出声明类型指定的声明类型

以下部分提供了声明规则的基本简介,并提供有关何时使用此规则的更多详细信息。

关于声明规则

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

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

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

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

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

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

传递所有声明值

使用此操作时,会将与指定的传入声明类型相匹配的所有传入声明值映射到指定的传出声明类型,然后将这些声明值作为传出声明发送到由联合身份验证服务签名的令牌中。

例如,如果为规则设置“传递所有声明值”选项逻辑并且指定传入声明类型“组”和传出声明类型“角色”,那么,从发出方流入的所有传入声明值将逐一复制到声明类型为“角色”的新传出声明中。

转换声明

在 AD FS 中,术语 声明转换 意味着将一个传入声明值替换为不同的传出声明值。 使此功能成为可能的是“转换传入声明”规则。 在此规则的属性中,可以设置条件,以根据指定的传入声明类型使用不同的传出声明值转换传入值。

例如,如下图所示,如果为规则设置将传入值替换为不同的传出声明值的条件,所有传入声明类型“组”都将映射到新的传出声明类型“角色”。 在这种情况下,传入声明值“Purchaser”将替换为新的传出声明值“Admin”。

何时使用转换

你也可以使用此规则应用一个条件,该条件将所有传入声明的指定电子邮件后缀值替换为新值。 例如,可以设置此规则中的条件,以将 sales.corp.fabrikam.com 后缀的所有声明值更改为 fabrikam.com。

对声明提供程序信任配置此规则

使用声明提供程序信任时,可以将此规则配置为将传入的声明从声明提供程序转换为可信等效项。 声明类型或声明值在组织中的含义可能与声明提供商组织中的含义不同。 可以使用此规则来规范化来自声明提供程序的声明类型和值,从而使信赖方能够理解输出的声明等效项。

对信赖方信任配置此规则

使用信赖方信任时,可以将此规则配置为针对特定信赖方转换声明。 声明类型或声明值对于特定信赖方可能有不同的含义,此规则使你能够更改单个信赖方的传出声明类型和值。

如何创建此规则

可以使用声明规则语言或使用 AD FS 管理管理单元中的 “转换传入声明 规则”模板创建此规则。 此规则模板提供以下配置选项:

  • 指定声明规则名称

  • 将特定的传入声明类型转换为指定的传出声明类型

  • 传递所有声明值

  • 将传入声明值替换为不同的传出声明值

  • 将传入的电子邮件后缀声明替换为新的电子邮件后缀

有关如何创建此模板的更多说明,请参阅 AD FS 部署指南中的 “创建规则以转换传入声明 ”。

使用声明规则语言

如果传出声明必须根据多个传入声明的内容构造,则必须改为使用自定义规则。 如果传出声明的声明值必须基于传入声明的值(但包含其他内容),则还必须在该上下文中使用自定义规则。 有关详细信息,请参阅 “何时使用自定义声明规则”。

如何构造转换规则语法的示例

使用声明规则语言语法转换声明时,可以将转换的声明的属性设置为新的文本值。 例如,以下规则将角色声明的值从“管理员”更改为“root”,同时保留相同的声明类型:

c:[type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/role", value == "Administrators"]  => issue(type = c.type, value = "root");

正则表达式也可用于声明转换。 例如,以下规则将 Windows 用户名声明中的域(以 DOMAIN\USER 格式)设置为 FABRIKAM:

c:[type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"] => issue(type = c.type, value = regexreplace(c.value, "(?<___domain>[^\\]+)\\(?<user>.+)", "FABRIKAM\${user}"));

创建自定义规则的最佳做法

声明转换可以选择性地应用于使用基本筛选功能选择的声明。 可以为用于筛选的每个声明属性分配值,并注意以下事项:

声明属性 DESCRIPTION
Type、Value、ValueType 这些属性最常用于分配。 必须为生成的转换声明至少指定类型和值。
发行人 虽然声明规则语言允许设置声明的颁发者,但通常不建议这样做。 声明的发出方在令牌中不会序列化。 收到令牌时,所有声明的 Issuer 属性都设置为对令牌进行签名的联合服务器的标识符。 因此,在规则中设置声明的颁发者不会影响令牌的内容,在将声明打包到令牌中后,该设置将丢失。 唯一需要设置声明发出方的情况为:它在声明提供程序规则集中设置为某个特定值,而信赖方规则集使用引用此特定值的规则创作。 如果未将 Issuer 属性显式设置为声明规则中的值,则声明颁发引擎将其设置为“LOCAL AUTHORITY”。
原始发行者 与颁发者类似,通常不应为 OriginalIssuer 显式指定一个值。 与“Issuer”(颁发者)不同的是,OriginalIssuer 属性在令牌中被序列化,但令牌使用者期望的是,若该属性被设定,它应包含最初颁发声明的联合服务器的标识符。
性能 如前一部分所述,声明的属性包不会保存在令牌中,因此,应该在后续的本地策略要引用属性中存储的信息时,才对属性分配值。

有关如何使用声明规则语言的详细信息,请参阅 声明规则语言的角色