何时使用自定义声明规则

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

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

  • 使用自定义 LDAP 筛选器从轻型目录访问协议 (LDAP) 属性存储中提取值后发送声明。

  • 基于从自定义属性存储中提取的值发送声明。

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

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

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

  • 创建声明,以便在以后的规则中使用,而无需实际发送声明。

  • 从多个输入声明的内容构造一个输出声明。

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

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

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

关于声明规则

声明规则表示采用传入声明的业务逻辑实例,向其应用条件(如果 x,则为 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 属性存储中用户的 windowsaccountnameoriginalissuer 属性发出专用个人标识符(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);

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

  • user SID

  • windowsaccountname

  • samaccountname