在最高级别,Active Directory 联合身份验证服务(AD FS)中的声明引擎是基于规则的引擎,专用于为联合身份验证服务提供服务和处理声明请求。 声明引擎是联合身份验证服务中的唯一实体,负责在配置的所有联合信任关系中运行每个规则集,并将输出结果移交给声明管道。
虽然声明管道是流声明的端到端过程的逻辑概念,但声明规则是一个实际的管理元素,可用于在声明规则执行过程中自定义声明流。 有关管道进程的详细信息,请参阅 声明管道的角色。
如下图所示,接受传入声明(接受规则)、授权声明请求者(授权规则)并通过组织中所有联合信任关系中的声明规则(颁发规则)发出传出声明(颁发规则)的行为由声明引擎执行。
声明规则执行过程
在您的组织中使用声明规则配置声明提供方信任或依赖方信任时,该信任的声明规则集通过调用声明引擎来应用声明规则中的必要逻辑,从而充当传入声明的守门员,确定是否发出任何声明以及发出哪些声明。
以下部分概述了引擎在声明流期间通过声明规则执行过程执行的每个步骤。 在索赔流程中描述的每个阶段,都会执行下面列出的每个步骤。 这些步骤包括:
步骤 1 - 初始化
步骤 2 – 执行
步骤 3 – 执行结果
有关管道进程的详细信息,请参阅 声明管道的角色。
步骤 1 - 初始化
在声明规则执行过程的第一步中,声明引擎首先将它们添加到 输入声明集来接受传入声明。 输入声明集类似于内存中的缓存,该缓存仅用于临时存储数据,前提是所需的进程要求数据可供检索。 规则执行完成后,将丢弃输入声明集数据。
为规则集向输入声明集添加声明
输入声明集是由声明引擎在处理与声明规则集关联的逻辑时临时将声明数据存储在内存中时创建的。 声明引擎会将所有传入声明复制到输入声明集,规则集中的第一个规则可以在其中检索这些声明。
例如,在下图中,声明引擎从传入声明中读取 A 和 B 的声明,并将其复制到输入声明集。 当声明 A 和 B 被纳入输入声明集后,声明引擎将检索并处理它们,作为声明规则集中第一个规则的逻辑输入。
声明规则集中的所有规则共享相同的输入声明集。 该集中的每个规则都可以添加到共享输入声明集,从而影响集中的所有后续规则。
步骤 2 – 执行
在声明规则过程的此步骤中,当声明引擎按时间顺序逐一执行特定规则集中的所有规则时,会处理声明规则。 规则集中的每个规则仅运行一次,并按它们从上到下的顺序执行,如 AD FS 管理管理单元的“编辑声明规则”对话框中所示。 首先处理位于规则集顶部的声明规则,然后处理后续规则,直到运行所有规则。
如声明规则语言中定义的那样,声明规则由两个部分组成:条件和颁发语句。 声明引擎首先使用输入声明集中的数据处理条件部分,以确定规则中指定的条件对于输入声明集中所包含的声明是否成立(与规则条件匹配的声明称为匹配的声明)。 如果找到任何匹配声明,则声明引擎会为每个匹配声明集执行规则的发出语句。 规则的发出语句可以对匹配声明执行以下任一任务:
将匹配声明复制到输出声明集中
转换声明字段内容,并在仅输入声明集中或在评估和输出声明集中创建出新声明。
使用匹配声明作为关键来查找属性存储中的更多信息,从而在输入声明集中或在输入和输出声明集中创建新的声明。
为规则集向输出声明集添加声明
输出声明集是内存中最初为空的位置,非常重要,因为声明引擎只会返回在执行过程完成后驻留在输出声明集中的声明。 这意味着,在计算最终的传出声明集时,将忽略仅驻留在输入声明集中且不在输出声明集中的任何声明。
为规则集向两个声明集添加声明
在处理规则时,声明要么添加到输入声明集中,要么同时添加到输入声明集和输出声明集中,具体取决于规则的颁发语句中使用的语句。 声明规则语言将这些语句表示为 添加 或 发布。
如果使用 add 语句,则声明只会添加到输入声明集,并且声明将仅用于执行目的,在执行完成后将不再存在。 如果使用 问题 语句,则声明将同时添加到输入声明集和输出声明集,并在执行完成后,在输出声明集中返回声明。 有关这些语句的详细信息,请参阅 声明规则语言的角色。
如果规则集中规则的条件部分与输入声明集中的任何声明不匹配,则忽略规则的颁发语句部分,因此不会向输出声明集或输入声明集添加任何声明。 下图和相应的步骤显示了声明引擎执行转换规则时会发生什么情况:
传入声明由声明引擎添加到输入声明集。
当第一个规则执行时,它会看到 A 和 B 声明,这些声明在当时是输入声明集中的唯一声明,并在规则 1 中处理规则逻辑的条件部分。
由于输入声明集中存在 A 声明,因此规则的条件将确定为 true(与声明 A 匹配),并将新的 C 声明添加到输入声明集和输出声明集。
规则 2 现在可以使用 A、B 和 C 声明(输入声明集中的所有声明)作为处理其逻辑的输入。
有关声明转换的详细信息,请参阅 “何时使用转换声明规则”。
步骤 3 – 执行结果
声明规则集执行的最后阶段将在给定规则集中运行所有规则后开始,并且输出声明集中存在最后一组声明。 此时,声明引擎将输出声明集的上下文作为规则集执行的输出返回。 从此以后,由声明管道接管此最终输出并将它移动到其过程中的下一个阶段。
将执行输出发送到声明管道
当声明引擎处理规则集时,该规则集在其输入和输出声明集的内存中有自己的专用位置。 这意味着,一个规则集使用的输入和输出声明集独立于另一个规则集中使用的输入和输出声明集。
在为给定规则集(步骤 1、2 和 3)运行整个过程后,新发布的传出声明(输出声明集的内容)将用作声明管道中下一个规则集的输入。 这样,声明就可以从一个规则集的输出流向另一个规则集的输入,如下图所示。
注释
虽然发出规则集也是管道中的关键阶段,但是上图并未显示它(只是为了简化该图)。 有关演示发出规则集以及它如何适用于声明管道的插图,请参阅 The Role of the Claims Pipeline。
在这种情况下,验收规则的输出由管道用来将验收规则生成的最终声明集流到管道中的第二阶段,即处理授权规则。 此时,整个声明规则执行过程(上面的步骤 1、2 和 3)会针对授权规则集再次运行。 此循环会持续到发出规则集(管道中的最后一个阶段)完成。
一旦从引擎针对发出规则集返回了已完成的传出声明,它们便会打包到 SAML 令牌中,联合身份验证服务会将该令牌发送回客户端。
处理授权规则
如果在声明规则执行过程的步骤 2 中执行的声明规则集包含授权规则(其输入和输出声明集与接受或颁发规则不同),将运行这些授权规则确定是否授权令牌请求者从基于该请求者声明的联合身份验证服务获取给定信赖方的安全令牌。
授权规则的目标是决定是否向用户颁发许可或拒绝授权,具体依据是用户是否被允许获取给定信赖方的令牌。 如下图所示,管道使用授权执行的输出来确定是否执行颁发规则集(基于存在或缺少允许和/或拒绝声明),但授权执行输出本身不用作声明规则集的输入。
有关声明授权的详细信息,请参阅 何时使用授权声明规则。