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