5.2. 策略表达式
概述
通常,wsp:Policy
元素由多个不同的策略设置组成(其中单个策略设置指定为 策略断言)。因此,wsp:Policy
元素定义的策略实际上是一个复合对象。wsp:Policy
元素的内容称为 策略表达式,策略表达式由基本策略断言的各种逻辑组合组成。通过定制策略表达式的语法,您可以确定在运行时必须满足哪些策略断言组合才能满足策略整体。
本节论述了策略表达式的语法和语义详情。
策略断言
策略断言是基本构建块,可以组合生成策略。策略断言有两个关键特征:它为策略主题添加基本功能单元,它代表在运行时评估的布尔值断言。例如,请考虑以下策略断言,它要求使用请求消息传播 WS-Security 用户名令牌:
<sp:SupportingTokens xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"> <wsp:Policy> <sp:UsernameToken/> </wsp:Policy> </sp:SupportingTokens>
与端点策略主题关联时,此策略断言具有以下效果:
- Web 服务端点 marshales/unmarshals UsernameToken 凭证。
-
在运行时,策略断言会返回
true
,如果提供了 UsernameToken 凭据(在客户端一中)或在传入消息(服务器端)中接收,策略断言会返回false
。
请注意,如果策略断言返回 false
,这不一定会导致错误。特定策略断言的 net effect 取决于它如何插入到策略中,以及它如何与其他策略断言相结合。
策略替代方案
策略是使用策略断言构建的,也可以使用 wsp:Optional
属性以及 wsp:All
和 wsp:ExactlyOne
元素的各种嵌套组合进行授权。制作这些元素的网络效果是生成一系列可接受的 策略替代方案。只要满足这些可接受的策略替代方案之一,整个策略也会被取消处理(等同于 true
)。
wsp:All 元素
当策略断言列表被 wsp:All
元素嵌套时,列表中的所有策略断言都必须评估为 true
。例如,请考虑以下身份验证和授权策略断言的组合:
<wsp:Policy wsu:Id="AuthenticateAndAuthorizeWSSUsernameTokenPolicy"> <wsp:All> <sp:SupportingTokens> <wsp:Policy> <sp:UsernameToken/> </wsp:Policy> </sp:SupportingTokens> <sp:SupportingTokens> <wsp:Policy> <sp:SamlToken/> </wsp:Policy> </sp:SupportingTokens> </wsp:All> </wsp:Policy>
如果满足以下条件,则前面的策略对特定的传入请求 满意 :
- WS-Security UsernameToken 凭证必须存在; 以及
- 必须存在 SAML 令牌。
wsp:Policy
元素完全等同于 wsp:All
。因此,如果您从上例中删除了 wsp:All
元素,您将获得一个语义相同的示例
wsp:ExactlyOne 元素
当策略断言列表被 wsp:ExactlyOne
元素嵌套时,列表 中至少有一个 策略断言必须评估为 true
。运行时会遍历列表,评估策略断言,直到找到返回 true
的策略断言。此时,会满足 wsp:ExactlyOne
表达式(返回 true
),并且列表中任何剩余的策略断言都不会被评估。例如,请考虑以下验证策略断言的组合:
<wsp:Policy wsu:Id="AuthenticateUsernamePasswordPolicy"> <wsp:ExactlyOne> <sp:SupportingTokens> <wsp:Policy> <sp:UsernameToken/> </wsp:Policy> </sp:SupportingTokens> <sp:SupportingTokens> <wsp:Policy> <sp:SamlToken/> </wsp:Policy> </sp:SupportingTokens> </wsp:ExactlyOne> </wsp:Policy>
如果以下条件之一,则前面的策略会满足特定的传入请求:
- WS-Security UsernameToken 凭证存在; 或者
- 存在 SAML 令牌。
请注意,特别是,如果两个 凭证类型都存在,则在评估其中一个断言后,会满足该策略,但没有保证实际上评估了哪些策略断言。
空策略
特殊情况是 空策略,一个在 例 5.1 “Empty 策略” 中显示的示例。
例 5.1. Empty 策略
<wsp:Policy ... > <wsp:ExactlyOne> <wsp:All/> </wsp:ExactlyOne> </wsp:Policy>
在空策略替代方案 < ;wsp:All/&
gt; 中,代表不需要满足策略断言的替代方法。换句话说,它总是返回 true
。当 <wsp:All
/> 作为替代方案时,即使没有策略断言为 true
,也可以全部策略。
null 策略
特殊情况是 null 策略,这是一个在 例 5.2 “Null 策略” 中显示的示例。
例 5.2. Null 策略
<wsp:Policy ... > <wsp:ExactlyOne/> </wsp:Policy>
其中 null 策略替代方案 & lt;wsp:ExactlyOne
/> 代表一个永不满足的替代选择。换句话说,它总是返回 false
。
普通形式
在实践中,通过嵌套 < ;wsp:All
& gt; 和 <wsp:ExactlyOne
> 元素,您可以生成相当复杂的策略表达式,其策略替代方案可能很难退出。为便于比较策略表达式,WS-Policy 规格定义了策略表达式的规范或规范 形式,以便您可以不清地读取策略替代列表。每个有效的策略表达式都可以减少为普通形式。
通常,普通形式策略表达式符合 例 5.3 “普通表单语法” 中显示的语法。
例 5.3. 普通表单语法
<wsp:Policy ... > <wsp:ExactlyOne> <wsp:All> <Assertion .../> ... <Assertion .../> </wsp:All> <wsp:All> <Assertion .../> ... <Assertion .../> </wsp:All> ... </wsp:ExactlyOne> </wsp:Policy>
其中每行 < wsp:All>…</wsp:All&
gt; 代表有效的策略替代方案。如果满足其中一项策略备选方案,则整个政策将满足。