何时使用自定义声明规则

使用声明规则语言在 Active Directory 联合身份验证服务 (AD FS) 中编写自定义声明规则,声明颁发引擎可使用该框架以编程方式生成、转换、传递和筛选声明。 通过使用自定义规则,可以创建逻辑比标准规则模板更复杂的规则。 在以下情况下可考虑使用自定义规则:

  • 发送以从结构化查询语言 (SQL) 属性存储提取的值为基础的声明。

  • 发送以使用自定义 LDAP 筛选器从轻型目录访问协议 (LDAP) 属性提取的值为基础的声明。

  • 发送以从自定义属性存储提取的值为基础的声明。

  • 仅当有两个或更多传入声明时发送声明。

  • 仅当传入声明值与复杂模式匹配时发送声明。

  • 发送对传入声明值进行了复杂更改的声明。

  • 创建声明仅供以后的规则使用,而不实际发送声明。

  • 根据多个传入声明的内容构造传出声明。

还可以在传出声明的声明值必须基于传入声明的值,但是还必须包括其他内容时使用自定义规则。

声明规则语言基于规则。 它包含条件部分和执行部分。 你可以使用声明规则语言语法来枚举、添加、删除或修改声明,以满足组织的需求。 有关其中每个部分的工作原理的详细信息,请参阅声明规则语言的角色

以下各节提供声明规则的基本简介。 它们还提供有关何时使用自定义声明规则的详细信息。

关于声明规则

声明规则表示接受传入声明、向其应用条件 (if x, then y) 并基于条件参数生成传出声明的业务逻辑的实例。

重要

  • 在“AD FS 管理”管理单元中,只能使用声明规则模板创建声明规则
  • 声明规则处理以下两种传入声明:直接来自声明提供程序(如 Active Directory 或另一个联合身份验证服务),或来自声明提供程序信任上的接受转换规则的输出。
  • 声明规则由声明颁发引擎按给定规则集内的时间顺序处理。 通过为规则设置优先级,可以进一步优化或筛选由给定规则集内以前的规则生成的声明。
  • 声明规则模板始终要求你指定传入声明类型。 但是,你可以使用单个规则处理声明类型相同的多个声明值。

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

如何创建此规则

可通过以下方式创建此规则:首先使用声明规则语言创作操作所需的语法,然后将结果粘贴到“使用自定义规则发送声明”模板中提供的文本框中,该模板位于“AD FS 管理”管理单元中声明提供程序信任或信赖方信任的属性上。

此规则模板提供下列选项:

  • 指定声明规则名称

  • 使用 AD FS 声明规则语言键入一个或多个可选条件和一个颁发语句

有关使用此模板创建自定义规则的更多说明,请参阅 AD FS 部署指南中的使用自定义规则创建规则以发送声明

为了更好地了解声明规则语言的工作原理,请查看管理单元中已经存在的其他规则的声明规则语言语法,方法是单击该规则的属性中的“查看规则语言”选项卡。 使用此部分中的信息和此选项卡上的语法信息可以深入了解如何构造你自己的自定义规则。

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

使用声明规则语言

例如:如何基于用户的名称属性值组合名字和姓氏

下面的规则语法根据给定属性存储中的属性值组合名字和姓氏。 策略引擎对每个条件的匹配项应用笛卡尔乘积。 例如,名字 {"Frank", "Alan"} 和姓氏 {"Miller", "Shen"} 的输出为 {"Frank Miller", "Frank Shen", "Alan Miller", "Alan Shen"}:

c1:[type == "http://exampleschema/firstname" ]
&&  c2:[type == "http://exampleschema/lastname",]
=> issue(type = "http://exampleschema/name", value = c1.value + "  " + c2.value);

例如:如何基于用户是否有直接报告发出管理人员声明

以下规则仅当用户有直接下属时发出管理人员声明:

c:[type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"] => add(store = "SQL Store", types = ("http://schemas.xmlsoap.org/claims/Reports"), query = "SELECT Reports FROM dbo.DirectReports WHERE UserName = {0}", param = c.value );
count([type == "http://schemas.xmlsoap.org/claims/Reports"] ) > 0 => issue(= "http://schemas.xmlsoap.org/claims/ismanager", value = "true");

例如:如何基于 LDAP 属性发出 PPID 声明

以下规则基于 LDAP 属性存储中的用户的“windowsaccountname”和“originalissuer”属性发出专用个人标识符 (PPID) 声明:

c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname"]
 => issue(store = "_OpaqueIdStore", types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier"), query = "{0};{1};{2}", param = "ppid", param = c.Value, param = c.OriginalIssuer);

可用于唯一标识此查询的用户的常见属性包括:

  • 用户 SID

  • windowsaccountname

  • samaccountname