5.2. 策略示例

概述

通常,ws p:Policy 元素由多个不同的策略设置组成(其中单个策略设置被指定为 策略断言)。因此,由 wsp:Policy 元素定义的策略实际上是一个复合对象。wsp:Policy 元素的内容称为 策略表达式,其中的策略表达式由基本策略断言的各种逻辑组合组成。通过定制策略表达式的语法,您可以确定在运行时必须满足哪些策略断言组合以满足策略的整体要求。

本节详细介绍了策略表达式的语法和语义。

策略断言

策略断言是基本的构建块,可以通过各种方式合并来生成策略。策略断言有两个关键特征:它为策略主题添加了基本功能单元,它代表了在运行时评估的布尔值断言。例如,请考虑以下策略断言,它需要使用请求消息传播 WS-Security username 令牌:

<sp:SupportingTokens xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
  <wsp:Policy>
    <sp:UsernameToken/>
  </wsp:Policy>
</sp:SupportingTokens>

当与端点策略主题关联时,此策略断言有以下影响:

  • Web 服务端点 marshales/unmarshals the UsernameToken 凭证。
  • 在运行时,如果出现 UsernameToken 凭证(在客户端一侧)提供或在传入消息(在服务器端)中接收,策略断言返回为 false

请注意,如果策略断言返回为 false,则不一定会导致错误。特定策略断言的 net effect 取决于它如何插入策略以及如何与其他策略反对。

策略替代

策略是使用策略断言程序构建,它还可使用 wsp:optional 属性以及 wsp: Allwsp:ExactlyOne 元素的各种嵌套组合。组成这些元素的 net effect 就是生成一系列可接受 策略的替代方案。只要满足这些可接受的策略替代方法之一,整个策略也会被验证(等同于 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 的策略断言。此时,ws p: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 /> 代表了不需要满足任何策略断言的替代选择。换句话说,它总是返回 true。当 <wsp:All /> 做为替代版本提供时,即使没有策略断言 也是如此,整个策略也可以被验证

null 策略

特殊情况下是 null 策略,其示例如下 例 5.2 “Null 策略”

例 5.2. Null 策略

<wsp:Policy ... >
   <wsp:ExactlyOne/>
</wsp:Policy>

对于 null 策略替代的,<wsp:ExactlyOne /> 是不满足的替代选择。换句话说,它总是返回 false

普通形式

在实践中,通过嵌套 &lt ;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;,代表有效的策略选择。如果上述某个策略替代方案已满足,则整体满足该策略。