UML软件工程组织

Web 服务策略框架
选自:www.microsoft.com

 

作者

Siddharth Bajaj, VeriSign
Don Box, Microsoft
Dave Chappell, Sonic Software
Francisco Curbera, IBM
Glen Daniels, Sonic Software
Phillip Hallam-Baker, VeriSign
Maryann Hondo, IBM
Chris Kaler, Microsoft
Dave Langworthy, Microsoft
Ashok Malhotra, Microsoft
Anthony Nadalin, IBM
Nataraj Nagaratnam, IBM
Mark Nottingham, BEA
Hemma Prafullchandra, VeriSign
Claus von Riegen, SAP
Jeffrey Schlimmer (Editor), Microsoft
Chris Sharp, IBM
John Shewchuk, Microsoft

特此授予读者免费且免版权费在任何介质中复制或显示 WS-Policy 规范(以下简称“规范”,它包含 WSDL 和架构文档)的权限,前提是您在 WS-Policy 规范的所有副本中包含下列内容,并且您:

1.

建立指向位于作者的 Web 站点之一的 WS-Policy 规范的链接或 URL

2.

进行 WS-Policy 规范中所显示的版权声明。

BEA Systems、IBM、Microsoft、SAP、Sonic Software 和 VeriSign(统称为“作者”)分别同意:对于它们认为是实现 WS-Policy 规范所需要的它们各自的必要专利权声明,在免除专利费以及其他合理的非歧视性条件下,授予您许可权。

WS-Policy 规范是“按原样”提供的,作者不作任何明示或暗示的说明或担保,包括(但不限于)对适销性、特殊用途的适应性、非侵权性或所有权的担保;WS-Policy 规范的内容适合于任何用途;这些内容的实施将不会侵犯任何第三方的专利权、版权、商标专用权或其他权利。

作者将不对由于使用或分发 WS-Policy 规范而产生的(或与之相关的)任何直接、间接、特殊、偶然或必然的损失负责。

在获得明确的书面许可以前,不得以任何方式使用“作者”的名称和商标,包括与 WS-Policy 规范或其内容相关的广告或宣传。WS-Policy 规范中的版权所有权在任何时候都由“作者”保留。

没有以暗示、禁止反言或其他方式授予其他任何权利。

摘要

Web 服务策略框架 (WS-Policy) 提供了一种通用模型及相应的语法,以便描述 Web 服务的策略。

WS-Policy 定义了一组基本结构,其他 Web 服务规范能够使用并扩展这些结构,以描述多种不同的服务要求和功能。

可组合的体系结构

Web 服务规范 (WS*) 被设计为能够互相组合,以提供一组丰富的工具,用于实现安全、可靠和/或事务性 Web 服务。WS-Policy 本身不为 Web 服务提供协商解决方案。WS-Policy 是一个构造块,它与其他 Web 服务协议和特定于应用程序的协议一起使用,以适应各种各样的策略交换模型。

状态

此 WS-Policy 规范是一个公开的草拟版本,仅供审阅和评估使用。作者希望在不远的将来能够征求您的稿件和建议。对于这些规范,作者未以任何方式做出任何担保或陈述。

*
本页内容
1. 引言 1. 引言
2. 表示法和术语 2. 表示法和术语
3. 策略模型 3. 策略模型
4. 策略表达式 4. 策略表达式
5. 安全注意事项 5. 安全注意事项
6. 致谢 6. 致谢
7. 参考资料 7. 参考资料

1. 引言

WS-Policy 提供了一种灵活且可扩展的语法,用于表达基于 XML Web 服务的系统中实体的功能、要求和一般特性。WS-Policy 定义了一个框架和一个模型,用于将这些属性表达为策略。

WS-Policy 将策略定义为一组策略替换选项,其中每个策略替换选项又是一组策略断言。某些策略断言指定了一些传统的要求和功能,这些要求和功能最终将出现在网络中(如身份验证方案、传输协议选择)。另一些策略断言并不直接表现在网络中,但却对正确地选择和使用服务至关重要(如隐私策略、QoS 特性)。WS-Policy 只提供了一种语法,以便这两种断言能够以一致的方式组织策略。

WS-Policy 并不指定如何发现策略,或者如何将策略附加到 Web 服务。其他规范可以自由定义用于将策略与各种实体和资源相关联的特定于各种技术的机制。WS-PolicyAttachment 就定义了这样的机制,特别是用于将策略与任意 XML 元素、WSDL 实体和 UDDI 元素相关联的机制。后续规范将提供有关在其他常用 Web 服务技术内部使用 WS-Policy 的配置文件。

1.1 目标

WS-Policy 的目标是提供使 Web 服务应用程序能够指定策略信息所需的机制。具体说来,该规范定义了以下内容:

一个称为策略表达式 的 XML 信息集合,其中包含特定于域的 Web 服务策略信息。

一组核心结构,用于指示如何在 Web 服务环境中应用选择和/或特定于域的策略断言集合。

WS-Policy 被设计为能够用于常规 Web 服务框架,包括 WSDL 服务说明 [WSDL] 和 UDDI 服务注册 [UDDIAPI20、UDDIDataStructure20、UDDI30]。

1.2 示例

以下示例所示为一个策略:

01 <wsp:Policy> 
02 <wsp:ExactlyOne> 
03 <wsse:SecurityToken>
04 <wsse:TokenType>wsse:Kerberosv5TGT</wsse:TokenType> 
05 </wsse:SecurityToken> 
06 <wsse:SecurityToken> 
07 <wsse:TokenType>wsse:X509v3</wsse:TokenType> 
08 </wsse:SecurityToken> 
09 </wsp:ExactlyOne> 
10 </wsp:Policy>

此示例演示了一个使用 WS-SecurityPolicy [WS-SecurityPolicy] 中所定义的断言的安全策略。行 01-10 表示用于身份验证的策略。

编者按:WS-Security Policy 中定义的断言将进行更新,但此处将暂时使用当前的断言。

行 02-09 所示为 Exactly One 策略运算符。策略运算符将策略断言组合为策略替换选项。对以上策略的有效解释为:对 Web 服务的调用包含其中一个所指定的安全标记断言(行 03-08)。

行 03-05 和 06-08 表示两个特定的安全策略断言,指示支持两种类型的身份验证。

2. 表示法和术语

这部分详细说明了在此规范中使用的表示法、命名空间和术语。

2.1 符号约定

本文档中的关键字“必须 (MUST)”、“绝不可以 (MUST NOT)”、“需要的 (REQUIRED)”、“将 (SHALL)”、“将不 (SHALL NOT)”、“应该 (SHOULD)”、“不应该 (SHOULD NOT)”、“推荐的 (RECOMMENDED)”、“可以 (MAY)”和“可选的 (OPTIONAL)”将按 RFC 2119 [RFC 2119] 中的说明进行解释。

命名空间 [XML-NS] URI 表示 RFC 2396 [RFC 2396] 中定义的一些应用程序相关或上下文相关的 URI。

该规范在标准纲要中使用以下语法:

该语法显示为一个 XML 实例,但以斜体 表示的值指示数据类型而不是值。

将字符附加到元素和属性后,以指示基数:

“?”(0 或 1)

“*”(0 或更高)

“+”(1 或更高)

字符“|”用于指示在替换选项之间进行选择。

字符“[”和“]”用于表示所包含的项目将被视为相对于基数和选择的组。

在此规范的其他位置,字符“[”和“]”用于调用引用和 XML 信息集属性名称。

2.2 扩展性

在标准结构内,省略号(即“...”)表示一个允许其他元素或属性信息项的扩展点。“可以”将信息项添加到所指示的扩展点,但是“绝不可以”违背扩展的 [parent][owner] 属性所指示的元素信息项的语义。如果处理器不能识别属性信息项,则该处理器“应当”忽略它;如果处理器不能识别元素信息项,则该处理器“应当”将其视为一个断言。

2.3 命名空间

实现此规范时“必须”使用的 XML 命名空间 URI 是:

http://schemas.xmlsoap.org/ws/2004/09/policy

WS-Policy 结构的 XML 架构 [XMLSchema1] 的标准化副本可以通过解析 URI“http://schemas.xmlsoap.org/ws/2004/09/policy”来获得。

本文档中使用了以下命名空间:

前缀 命名空间

wsdl

http://schemas.xmlsoap.org/wsdl/

wsse

http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd

wsp

http://schemas.xmlsoap.org/ws/2004/09/policy

wsu

http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd

xs

http://www.w3.org/2001/XMLSchema

本文档中,引用了一个实用工具架构 (http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd) 中的 @wsu:Id 属性。该实用工具架构之所以包含 @wsu:Id 属性,是为了使要求全局 ID 的其他规范能够进行引用(像本文档中一样)。

2.4 术语

下面,介绍一下本文档中通篇都要用到的下列术语:

策略策略 是策略替换选项的集合。

策略替换选项策略替换选项 是策略断言的集合。

策略断言策略断言 表示行为的个别要求、功能或其他属性。

策略断言类型策略断言类型 表示一类策略断言,并隐式地为断言的实例和特定于断言的语义指定了一个架构。

策略词汇表— 策略的策略词汇表 是该策略中使用的所有策略断言类型的集合。

策略表达式策略表达式 是策略的 XML 信息集表示形式,它可以是标准形式,也可以是等效的简约形式。

策略主体策略主体 是可以将策略与其相关联的实体(例如,终结点、消息、资源、交互)。

策略范围策略范围 是可以将策略应用于的策略主体的集合。

策略附件策略附件 是一种用于将策略与一个或多个策略范围相关联的机制。

3. 策略模型

本节定义了一个用于策略和对策略的操作的抽象模型。

该抽象模型与将它表示为 XML 信息集的方式无关。

3.1 策略断言

策略断言标识了一种行为,这种行为是策略主体的一项要求(或功能)。断言指示特定于域(如安全性、事务)的语义,它应当定义在单独的、特定于域的规范中。

断言是强类型的。其类型仅由表示该断言的根元素信息项的 XML 信息集 [namespace name][local name] 属性(即限定名,也称为 QName)来标识。给定类型的断言“必须”进行一致的解释,而无论它们的策略主体是什么。

断言的 XML 信息集“可以”包含一个非空的 [attributes] 属性和/或一个非空的 [children] 属性。这些内容“可以”用于参数化断言所指示的行为。例如,标识支持特定的可靠消息处理机制的断言可以包含一个属性信息项,以指示在发送确认之前,终结点要等待多久。但是,如果根元素信息项本身足以传达该要求(功能),则不需要使用附加的断言内容。

3.2 策略替换选项

策略替换选项是一组可以为空的策略断言。带有零个断言的替换选项表示无行为。具有一个或多个断言的替换选项指示由且仅由这些断言所暗示的行为。

策略替换选项的词汇表是该替换选项中所有断言类型的集合。策略的词汇表是该策略中使用的所有断言类型的集合。如果一个断言的类型在策略的词汇表中,但是没有包含在替换选项中,则该断言会被该替换选项显式地禁止。

替换选项内的断言并不排序,因此将(断言所指示的)行为应用到主体的顺序不在本规范的讨论范围内。

一个策略替换选项“可以”包含一个断言类型的多个实例。用于确定断言实例(以及它们的架构后验证信息集 (PSVI) 内容,如果有的话)所指示的综合行为的机制特定于断言的类型,这不在本文档的讨论范围内。

3.3 策略

在抽象层,策略是一组可能为空的策略替换选项。包含零个替换选项的策略不包含任何选项;具有一个或多个替换选项的策略表示可以在策略内选择要求(或功能)。

替换选项并不排序,因此给定上下文中替换选项之间的优先顺序不在本规范的讨论范围内。

策略中不同替换选项所指示的行为可能完全不同。与此相对,策略内的替换选项也可以非常相似。任一情况下,替换选项的值或适用性通常是该替换选项内断言的语义的功能,因此,这也超出了本规范的讨论范围。

3.4 Web 服务

策略应用在 Web 服务模型中,用于表达两个 Web 服务终结点之间的交互条件。满足策略中的断言通常会导致反映这些条件的行为。通常,Web 服务的提供方会公开一个策略,以表达它提供服务的条件。请求方可以使用该策略来决定是否使用该服务。请求方可以选择任何替换选项,原因是每个替换选项都是一个能够与服务交互的有效配置,但是请求方必须只能选择一个替换选项,原因是每个替换选项都是一个替换配置。

当且仅当请求方满足与策略断言 相应的要求(或提供该功能)时,该请求方才支持 该断言。当且仅当请求方支持策略替换选项 中的所有断言时,该请求方才支持 该替换选项。并且,当且仅当请求方支持策略 中至少一个替换选项时,该请求方才支持 该策略。请注意,虽然策略替换选项原本应当是互斥的,但通常无法确定是否可以同时支持一个以上的替换选项。

请注意,一个请求方也许能够支持一个策略,即使该请求方不能理解该策略词汇表中各个断言的类型;请求方只需理解策略替换选项 词汇表中各个断言的类型。这一特性对于版本控制和新断言的递增部署至关重要,原因是它使得提供方的策略能够在新的替换选项中包括新断言,同时允许请求方以向后兼容的方式使用旧式的替换选项。

4. 策略表达式

策略表达式是策略的 XML 信息集表示形式,用于以互操作的形式表达策略。标准形式的策略表达式是最直接的信息集;等效的备用信息集允许通过若干结构简洁地表达策略。

4.1 标准形式策略表达式

为了促进互操作性,本规范定义了一个策略表达式的标准形式,它是一种策略的直接 XML 信息集表示形式,用于枚举该策略的各个替换选项,而替换选项则枚举它们的各个断言。策略表达式标准形式的架构纲要如下:

<wsp:Policy ... > 
    <wsp:ExactlyOne> [ <wsp:All> [ <Assertion ...> ... </Assertion> ]* </wsp:All> ]* 
    </wsp:ExactlyOne> 
</wsp:Policy>

下面说明了上述架构纲要中定义的元素信息项:

/wsp:Policy

一个策略表达式。

/wsp:Policy/wsp:ExactlyOne

一组策略替换选项。如果 [children] 属性中没有任何元素信息项,则不存在任何符合条件的策略替换选项,即,没有任何符合条件的行为。

/wsp:Policy/wsp:ExactlyOne/wsp:All

一个策略替换选项;一组策略断言。如果 [children] 属性中没有任何元素信息项,则这是一个空的符合条件的策略替换选项,即,未指定任何行为。

/wsp:Policy/wsp:ExactlyOne/wsp:All/*

策略断言的 XML 信息集表示形式。

为了简化处理并提高互操作性,策略表达式的标准形式应当在适宜的场合使用。

例如,以下是前面介绍的策略表达式示例的标准形式。

01 <wsp:Policy> 
02 <wsp:ExactlyOne> 
03 <wsp:All> 
04 <wsse:SecurityToken> 
05 <wsse:TokenType>wsse:Kerberosv5TGT</wsse:TokenType> 
06 </wsse:SecurityToken> 
07 </wsp:All> 
08 <wsp:All> 
09 <wsse:SecurityToken> 
10 <wsse:TokenType>wsse:X509v3</wsse:TokenType> 
11 </wsse:SecurityToken> 
12 </wsp:All> 
13 </wsp:ExactlyOne> 
14 </wsp:Policy>

行 03-07 和 08-12 表达了策略中的两个替换选项。如果选择了第一个替换选项,则仅支持 Kerberos 标记类型;相反,如果选择了第二个替换选项,则仅支持 X509 标记类型。

4.2 策略标识

可以为策略表达式指定一个命名空间,使用 wsp:Policy 元素的 @TargetNamespace 属性表示,或者从包含元素(如 wsdl:definitions、xs:schema)继承。如果容器未指定任何命名空间,并且 wsp:Policy 元素的 @TargetNamespace 也未指定,则命名空间为 ""。

策略表达式本身也可以是一个 Web 资源,因此可以使用 URI 标识。为了能够将策略表达式嵌套在任意包含元素中,可以使用 @wsu:Id 属性来指示分段 ID。

这些属性的架构纲要如下:

<wsp:Policy xml:base="xs:anyURI" ? wsu:Id="xs:ID" ? TargetNamespace="xs:anyURI" ? ... > ... 
</wsp:Policy>

下面说明了上述架构纲要中列出和定义的属性信息项:

/wsp:Policy/@wsu:Id

作为相对 URI 的策略表达式的标识。为了引用该表达式,可以通过将该标识用作相对于 XML 基(即 base#@wsu:Id)的一个本地名称,来形成一个绝对 URI。

/wsp:Policy/@TargetNamespace

当周围的上下文中没有可用的命名空间,或者当需要其他目标命名空间时,作为策略表达式的命名空间 URI。

下面的示例演示了如何将策略表达式与 URI 相关联:

<wsp:Policy xml:base="http://fabrikam123.com/policies" wsu:Id="P1" >
  <wsse:SecurityToken>
    <wsse:TokenType>wsse:Kerberosv5TGT</wsse:TokenType>
  </wsse:SecurityToken>
  <wsse:Integrity>
    <wsse:Algorithm Type="wsse:AlgSignature" 
                    URI="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
  </wsse:Integrity>
</wsp:Policy>

在上面的示例中,策略的 URI 将为“http://fabrikam123.com/policies#P1”。

4.3 简约策略表达式

为了以更为简洁的形式表达策略,同时仍使用 XML 信息集,本规范定义了三个结构:一个用于修饰断言的属性、用于递归式嵌套策略运算符的语义和一种策略引用/包含机制。下面的子节分别对它们进行了说明。

为了以可互操作的方式解释简约策略表达式,可以通过以下过程将简约表达式转换为相应的标准形式表达式:

1.

首先从策略表达式的文档信息项的 [document element] 属性 D 入手。D 的 [namespace name] 始终为“http://schemas.xmlsoap.org/ws/2004/09/policy”。在基本情况下,D 的 [local name] 属性为“Policy”;在递归情况下,D 的 [local name] 属性为“Policy”、“ExactlyOne”或“All”。

2.

扩展 D 的 [children] 属性的元素信息项,这些元素信息项为策略引用,如 4.3.3 一节所述。

3.

将 D 的 [children] 属性中的各个元素信息项 C 转换为标准形式。

1.

如果 C 的 [namespace name] 属性为“http://schemas.xmlsoap.org/ws/2004/09/policy”,并且 C 的 [local name] 属性为“Policy”、“ExactlyOne”或“All”,则 C 为策略运算符的表达式;通过递归应用此过程来标准化 C。

2.

其他情况下,元素信息项 C 为断言;按照 4.3.1 节中的说明标准化 C。

4.

将策略运算符 D 应用到其 [children] 属性中的标准化元素信息项,并构建一个标准形式,如 4.3.2 所述。

请注意,在实现时,可以使用更为高效的过程,而无须显式地将简约表达式转换为标准形式,只要能够得到与此相同的处理结果即可。

4.3.1 @wsp:Optional

为了指示策略断言为可选,该规范定义了一个属性,该属性是一个使用或不使用断言来表达策略替换选项的语法快捷方式。该属性的架构纲要如下:

<Assertion [ wsp:Optional="xs:boolean" ]? ...> ... </Assertion>

下面说明上述架构纲要中定义的属性信息项:

/Assertion/@wsp:Optional

如果为真,则断言表达式在语义上等效于以下内容:

<wsp:ExactlyOne>
  <wsp:All> <<i>Assertion</i> ...> ... </<i>Assertion</i>> </wsp:All>
  <wsp:All />
</wsp:ExactlyOne>

如果为假,则断言表达式在语义上等效于以下内容:

<wsp:ExactlyOne>
  <wsp:All> <<i>Assertion</i> ...> ... </<i>Assertion</i>> </wsp:All>
</wsp:ExactlyOne>

省略此属性在语义上等效于包括它,并赋予 false 值。策略表达式不应当包含值为 false 的此属性,但是策略解析器必须接受值为 false 的此属性。

例如,下面的简约策略表达式:

01 <wsp:Policy>
02   <wsse:SecurityToken wsp:Optional="true" >
03     <wsse:TokenType>wsse:Kerberosv5TGT</wsse:TokenType>
04   </wsse:SecurityToken>
05 </wsp:Policy>

等效于下面的标准形式策略表达式:

A <wsp:Policy>
B   <wsp:ExactlyOne>
C     <wsp:All>
D       <wsse:SecurityToken>
E         <wsse:TokenType>wsse:Kerberosv5TGT</wsse:TokenType>
F       </wsse:SecurityToken>
G     </wsp:All>
H     <wsp:All />
I   </wsp:ExactlyOne>
J </wsp:Policy>

第一段第 2 行中的 @wsp:Optional 属性指示行 02-04 中的断言将包括在一个策略替换选项中,但不包括在另一个策略替换选项中;它包括在行 C-G 中,但是不包括在行 H 中。请注意,@wsp:Optional 并没有出现在策略表达式的标准形式中。

4.3.2 策略运算符

要简洁地表达复杂的策略,“可以”递归嵌套策略运算符;即,“可以”将一个或多个 wsp:Policy、wsp:All 和/或 wsp:ExactlyOne 的实例嵌套在 wsp:Policy、wsp:All 和/或 wsp:ExactlyOne 内。

下列规则用于将简约策略表达式转换为标准形式策略表达式:

等效

wsp:Policy 等效于 wsp:All。

表示具有零个策略断言的策略。请注意,由于 wsp:Policy 等效于 wsp:All,因此, 等效于 ,即具有零个断言的策略替换选项。

表示具有零个策略替换选项的策略。

可交换的

正如前面所提到的,策略替换选项内的策略断言和策略内的策略替换选项是没有顺序的(请分别参见 Error!Reference source not found.Error!Reference source not found.),wsp:All 和 wsp:ExactlyOne 是可交换的。例如,

<wsp:All> 
  <!-- assertion 1 --> 
  <!-- assertion 2 --> 
</wsp:All>

等效于:

<wsp:All> 
  <!-- assertion 2 --> 
  <!-- assertion 1 --> 
</wsp:All>

而:

<wsp:ExactlyOne>
  <i><!-- assertion 1 --> 
  <!-- assertion 2 --></i>
</wsp:ExactlyOne>

等效于:

<wsp:ExactlyOne>
  <i><!-- assertion 2 --> 
  <!-- assertion 1 --></i>
</wsp:ExactlyOne>

结合的

wsp:All 和 wsp:ExactlyOne 是相结合的。例如,

<wsp:All> 
  <!-- assertion 1 --> 
<wsp:All> 
  <!-- assertion 2 --> 
</wsp:All> 
</wsp:All>

等效于:

<wsp:All> 
  <!-- assertion 1 --> 
  <!-- assertion 2 --> 
</wsp:All>

而:

<wsp:ExactlyOne> 
   <!-- assertion 1 --> 
<wsp:ExactlyOne> 
   <!-- assertion 2 --> 
</wsp:ExactlyOne> 
</wsp:ExactlyOne>

等效于:

<wsp:ExactlyOne> 
  <!-- assertion 1 --> 
  <!-- assertion 2 --> 
</wsp:ExactlyOne>

等幂

wsp:All 和 wsp:ExactlyOne 是等幂的。例如,

<wsp:All> 
<wsp:All> 
  <!-- assertion 1 --> 
  <!-- assertion 2 --> 
</wsp:All> 
</wsp:All>

等效于:

<wsp:All> 
  <!-- assertion 1 --> 
  <!-- assertion 2 --> 
</wsp:All>

而:

<wsp:ExactlyOne> 
<wsp:ExactlyOne> 
  <!-- assertion 1 --> 
  <!-- assertion 2 --> 
</wsp:ExactlyOne> 
</wsp:ExactlyOne>

等效于:

<wsp:ExactlyOne> 
  <!-- assertion 1 --> 
  <!-- assertion 2 --> 
</wsp:ExactlyOne>

可分配的

wsp:All 通过 wsp:ExactlyOne 进行分配。例如,

<wsp:All> 
  <wsp:ExactlyOne> 
    <!-- assertion 1 --> 
    <!-- assertion 2 --> 
  </wsp:ExactlyOne> 
  <wsp:ExactlyOne> 
    <!-- assertion 3 --> 
    <!-- assertion 4 --> 
  </wsp:ExactlyOne> 
  </wsp:All>

等效于:

<wsp:ExactlyOne> 
  <wsp:All>
    <!-- assertion 1 -->
    <!-- assertion 3 -->
  </wsp:All> 
  <wsp:All>
    <!-- assertion 1 -->
    <!-- assertion 4 -->
  </wsp:All> 
  <wsp:All>
    <!-- assertion 2 -->
    <!-- assertion 3 -->
  </wsp:All> 
  <wsp:All>
    <!-- assertion 2 -->
    <!-- assertion 4 -->
  </wsp:All> 
  </wsp:ExactlyOne>

类似地,

<wsp:All> 
  <wsp:ExactlyOne> 
    <!-- assertion 1 --> 
    <!-- assertion 2 --> 
  </wsp:ExactlyOne> 
</wsp:All>

等效于:

<wsp:ExactlyOne> 
  <wsp:All> 
    <!-- assertion 1 --> 
  </wsp:All> 
  <wsp:All> 
    <!-- assertion 2 --> 
  </wsp:All> 
</wsp:ExactlyOne>

通过空 wsp:ExactlyOne 对 wsp:All 进行分配等效于无替换选项。例如,

<wsp:All> 
  <wsp:ExactlyOne> 
    <!-- assertion 1 --> 
    <!-- assertion 2 --> 
  </wsp:ExactlyOne> 
  <wsp:ExactlyOne /> 
  </wsp:All>

等效于:

<wsp:ExactlyOne />

策略运算符用于表达策略断言之间的关系,应以非透明方式处理它们。断言的 XML 信息集“不应当”在它的 [children] 属性中包含策略运算符。要在域内表达选择,断言的作者应当考虑定义多个断言,或者参数化断言。这样,策略的作者就可以使用策略替换选项来表达选择。

例如,假设下面的简约策略表达式:

01 <wsp:Policy>
02   <wsp:ExactlyOne>
03     <wsse:SecurityToken>
04       <wsse:TokenType>wsse:Kerberosv5TGT</wsse:TokenType>
05     </wsse:SecurityToken>
06     <wsse:SecurityToken>
07       <wsse:TokenType>wsse:X509v3</wsse:TokenType>
08     </wsse:SecurityToken>
09   </wsp:ExactlyOne>
10   <wssx:Audit wsp:Optional="true" />
11 </wsp:Policy>

将 4.3.1 节应用到行 10 中的 @wsp:Optional,然后将 4.3.1 节应用到行 03-05 和 06-08 中的断言的 @wsp:Optional 隐含值,将得到:

A <wsp:Policy>
B   <wsp:ExactlyOne>
C     <wsp:All>
D       <wsse:SecurityToken>
E         <wsse:TokenType>wsse:Kerberosv5TGT</wsse:TokenType>
F       </wsse:SecurityToken>
G     </wsp:All>
H     <wsp:All>
I       <wsse:SecurityToken>
J         <wsse:TokenType>wsse:X509v3</wsse:TokenType>
K       </wsse:SecurityToken>
L     </wsp:All>
M   </wsp:ExactlyOne>
N   <wsp:ExactlyOne>
O     <wsp:All><wssx:Audit /></wsp:All>
P     <wsp:All />
Q   </wsp:ExactlyOne>
R </wsp:Policy>

请注意,行 10 中列出的断言扩展为行 O 和 P 中的两个替换选项。

最后,请注意,wsp:Policy 等效于 wsp:All,而通过 wsp:ExactlyOne 对 wsp:All 进行分配将得到下面的标准形式策略表达式:

01 <wsp:Policy>
02   <wsp:ExactlyOne>
03     <wsp:All>
04       <wsse:SecurityToken>
05         <wsse:TokenType>wsse:Kerberosv5TGT</wsse:TokenType>
06       </wsse:SecurityToken>
07       <wssx:Audit />
08     </wsp:All>
09     <wsp:All>
10       <wsse:SecurityToken>
11         <wsse:TokenType>wsse:Kerberosv5TGT</wsse:TokenType>
12       </wsse:SecurityToken>
13     </wsp:All>
14     <wsp:All>
15       <wsse:SecurityToken>
16         <wsse:TokenType>wsse:X509v3</wsse:TokenType>
17       </wsse:SecurityToken>
18       <wssx:Audit />
19     </wsp:All>
20     <wsp:All>
21       <wsse:SecurityToken>
22         <wsse:TokenType>wsse:X509v3</wsse:TokenType>
23       </wsse:SecurityToken>
24     </wsp:All>
25   </wsp:ExactlyOne>
26 </wsp:Policy>

请注意,将行 C-G 和 H-L 中列出的两个替换选项与行 O 和 P 中列出的两个替换选项相组合,可以在标准化策略中创建四个替换选项,即,行 03-08、09-13、14-19 和 20-24。

4.3.3 策略包含

为了能够在不同的策略表达式之间共享断言,“可以”在策略表达式内任何允许策略断言的位置使用 wsp:PolicyReference 元素。该元素用于在一个策略表达式中包括另一个策略表达式的内容。

当 wsp:PolicyReference 元素引用 wsp:Policy 元素时,包含的语义仅仅是使用 [children] 属性与所引用的 wsp:Policy 元素的 [children] 属性相同的 wsp:All 元素取代 wsp:PolicyReference 元素。即,所引用策略的内容在概念上取代了 wsp:PolicyReference 元素,并被包装在 wsp:All 运算符中。(注:在包括具有摘要属性的引用之前,“应当”对其进行验证。)

策略断言“绝不可以”包含 wsp:PolicyReference。如果策略表达式需要引用其他策略表达式,有效的方法是将断言封装到一个运算符中,并在将扩展到所引用的策略表达式中的运算符内使用引用。

wsp:PolicyReference 元素的架构纲要如下所示:

<wsp:Policy>
  ...
  <wsp:PolicyReference URI="<i>xs:anyURI</i>"
                       Digest="<i>xs:base64Binary</i>" ?
                       DigestAlgorithm="<i>xs:anyURI</i>" ? />
  ...
</wsp:Policy>

下面说明上述架构纲要中定义的属性和元素信息项:

/wsp:Policy/.../wsp:PolicyReference

该元素引用了一个要包含的策略表达式。

/wsp:Policy/.../wsp:PolicyReference/@URI

该属性通过 URI 引用了一个策略表达式。不要求该 URI 可解析。

/wsp:Policy/.../wsp:PolicyReference/@Digest

该可选属性指定了所引用的策略表达式的摘要。它用于确保所包括的策略是预期策略。

/wsp:Policy/.../wsp:PolicyReference/@DigestAlgorithm

该可选 URI 属性指定了正在使用的摘要算法。本规范预先定义了下面的算法,但也可以表达其他算法。

URI 说明

http://schemas.xmlsoap.org/ws/2004/09/policy/Sha1Exc (暗含)

摘要是 octet 流上的 SHA1 哈希,这是通过使用为 XML 签名 [XMLSignature] 定义的专用 XML 规范化得到的。

在下面的示例中,包括了两个策略,并扩展了一个公共策略。在第一个示例中,有一个策略文档,其中包含了三个策略表达式。第一个表达式被赋予一个标识符,而不是一个完全限定的位置。第二和第三个表达式使用 URI 引用了第一个元素,指示所引用的元素在文档内。

<wsp:Policy wsu:Id="AUDIT" >
  <wssx:Audit wsp:Optional="true" />
</wsp:Policy>
<wsp:Policy >
  <wsp:PolicyReference URI="#AUDIT" />
  <wsse:SecurityToken>
    <wsse:TokenType>wsse:X509v3</wsse:TokenType>
  </wsse:SecurityToken>
</wsp:Policy>
<wsp:Policy >
  <wsp:PolicyReference URI="#AUDIT" />
  <wsse:SecurityToken>
    <wsse:TokenType>wsse:Kerberosv5TGT</wsse:TokenType>
  </wsse:SecurityToken>
</wsp:Policy>

有时,需要“重用”策略表达式的一部分。通常,这可以通过将公共断言放在单独的策略表达式中并对其进行引用来实现。

4.4 策略交集

当有两方或多方主体要表达策略,并且希望将策略替换选项限制到互相兼容的策略替换选项时,策略交集很有用。例如,当请求方和提供方对消息交换表达要求时,可以使用交集标识请求方和提供方策略中都包括的兼容策略替换选项(如果有)。交集是一个可互换的结合函数,可以获取两个策略并返回一个策略。

由于策略替换选项所指示的行为集合依赖于全部断言实例中特定于域的语义,因此,确定两个策略替换选项是否兼容通常涉及到特定于域的处理。作为第一次近似处理,这里定义了一种算法,以与域无关的方式接近兼容;具体说来,要使两个策略替换选项兼容,它们必须至少具有相同的词汇表

使用该近似方法,两个输入策略 P1 和 P2 之间的交集是策略 Pi,它包含具有下列特性的各个策略替换选项 Ai:

假定 P1 中的某个策略替换选项 Ax 和 P2 中的某个替换选项 Ay,并且 Ax 的词汇表 == Ay 的词汇表,

Ai 中的断言实例集合是 Ax 中的所有断言实例,也是 Ay 中的所有断言实例。

以上定义意味着:

Ai 的词汇表 == Ax 的词汇表 == Ay 的词汇表。

当两个输入策略的词汇表重叠但不相同时,这些策略的交集的词汇表是输入策略的词汇表的子集。

如果一个策略的词汇表中包含的一个断言类型不在另一个策略的词汇表中,则与该断言类型相关联的行为将在这些策略的交集中被禁止。

作为交集的示例,可以考虑以下两个输入策略:

<wsp:Policy> // Policy P1
  <wsp:ExactlyOne>
    <wsp:All> // Alternative A1
      <wsse:Confidentiality>
        <wsse:Algorithm Type="wsse:AlgEncryption"
                        URI="http://www.w3.org/2001/04/xmlenc#3des-cbc" />
        <MessageParts
            Dialect="http://schemas.xmlsoap.org/2002/12/wsse#part" >
          wsp:Body
        </MessageParts>
      </wsse:Confidentiality>
    </wsp:All>
    <wsp:All> // Alternative A2
      <wsse:Confidentiality>
        <wsse:Algorithm Type="wsse:AlgEncryption"
                        URI="http://www.w3.org/2001/04/xmlenc#3des-cbc" />
        <MessageParts
            Dialect="http://schemas.xmlsoap.org/2002/12/wsse#part" >
          wsp:Body
        </MessageParts>
      </wsse:Confidentiality>
      <wsse:SecurityHeader MustPrepend="true" 
                           MustManifestEncryption="true" />
    </wsp:All>
  </wsp:ExactlyOne>
</wsp:Policy></pre>
<pre class="code"><wsp:Policy> // Policy P2
  <wsp:ExactlyOne>
    <wsp:All> // Alternative A3
      <wsse:Confidentiality>
        <wsse:Algorithm Type="wsse:AlgEncryption"
                        URI="http://www.w3.org/2001/04/xmlenc#3des-cbc" />
        <MessageParts
            Dialect="http://schemas.xmlsoap.org/2002/12/wsse#part" >
          wsp:Body wsp:Header(x:AccountNumber)
        </MessageParts>
      </wsse:Confidentiality>
      <wsse:SecurityHeader MustManifestEncryption="true" />
    </wsp:All>
    <wsp:All> // Alternative A4
      <wsse:Confidentiality>
        <wsse:Algorithm Type="wsse:AlgEncryption"
                        URI="http://www.w3.org/2001/04/xmlenc#3des-cbc" />
        <MessageParts
            Dialect="http://schemas.xmlsoap.org/2002/12/wsse#part" >
          wsp:Body wsp:Header(x:AccountNumber)
        </MessageParts>
      </wsse:Confidentiality>
      <wsse:SecurityHeader MustManifestEncryption="true" />
      <wsse:MessageAge Age="3600" />
    </wsp:All>
  </wsp:ExactlyOne>
</wsp:Policy>

由于策略 P1 中只有一个其词汇表与策略 P2 中的替换选项 (A3) 相同的替换选项 (A2),因此,交集为包含一个替换选项的策略,其中包含 A2 和 A3 中的所有断言。

<wsp:Policy> // Intersection of P1 and P2
  <wsp:ExactlyOne>
    <wsp:All>
      <wsse:Confidentiality>
        <wsse:Algorithm Type="wsse:AlgEncryption"
                        URI="http://www.w3.org/2001/04/xmlenc#3des-cbc" />
        <MessageParts
            Dialect="http://schemas.xmlsoap.org/2002/12/wsse#part" >
          wsp:Body
        </MessageParts>
      </wsse:Confidentiality>
      <wsse:SecurityHeader MustPrepend="true" 
                           MustManifestEncryption="true" />
      <wsse:Confidentiality>
        <wsse:Algorithm Type="wsse:AlgEncryption"
                        URI="http://www.w3.org/2001/04/xmlenc#3des-cbc" />
        <MessageParts
            Dialect="http://schemas.xmlsoap.org/2002/12/wsse#part" >
          wsp:Body wsp:Header(x:AccountNumber)
        </MessageParts>
      </wsse:Confidentiality>
      <wsse:SecurityHeader MustManifestEncryption="true" />
    </wsp:All>
  </wsp:ExactlyOne>
</wsp:Policy>

请注意,策略 P1 的词汇表为 {wsse:Confidentiality, wsse:SecurityHeader},策略 P2 的词汇表为 {wsse:Confidentiality, wsse:SecurityHeader, wsse:MessageAge},而交集的词汇表为交集 {wsse:Confidentiality, wsse:SecurityHeader}。

请注意,断言类型 wsse:Confidentiality 有一个以上的实例;当调用与 wsse:Confidentiality 相关联的行为时,将使用两个断言实例的内容来指示正确的行为。这两个实例是否兼容依赖于 wsse:Confidentiality 断言中特定于域的语义。要能够较好地利用交集,建议断言作者将断言组织为使同一断言类型的两个实例始终(至少在通常情况下)兼容。

5. 安全注意事项

强烈“推荐”对策略和断言进行签名,以防止被篡改。

除非策略已签名并具有关联的安全标记,以表明签名者有权为包含该策略的范围“代言”,否则“不应该”接受这些策略。即,依赖方不应该依赖于某个策略,除非该策略已签名并具有足够的凭据,能够达到依赖方的接受标准。

应该注意的是,本文档中描述的机制应该作为 SOAP 消息 [SOAP11, SOAP12] 的一部分,使用 WS-Security [WS-Security] 进行保护,或者使用特定于对象的安全机制嵌入到其他对象中。

6. 致谢

我们衷心感谢以下人员为此规范所做的贡献: Dimitar Angelov (SAP), Martijn de Boer (SAP), Erik Christensen (Microsoft), Giovanni Della-Libera (Microsoft), Yigal Hoffner (IBM), Brian Hulse (IBM), Andrew Jones (IBM), Todd Karakashian (BEA), Scott Konersmann (Microsoft), Frank Leymann (IBM), Steve Lucco (Microsoft), Al Lee (Microsoft), David Levin (Microsoft), Hiroshi Maruyama (IBM), Steve Millet (Microsoft), Vick Mukherjee (Microsoft), Henrik Frystyk Nielsen (Microsoft), Paul Nolan (IBM), Keith Stobie (Microsoft), Tony Storey (IBM), Sanjiva Weerawarana (IBM), Volker Wiechers (SAP).

7. 参考资料

[RFC 2119]

S. Bradner, "Key words for use in RFCs to Indicate Requirement Levels," RFC 2119, March 1997.

[RFC 2396]

T. Berners-Lee, et al, "Uniform Resource Identifiers (URI): Generic Syntax," RFC 2396, August 1998.

[SOAP11]

D. Box, et al, "Simple Object Access Protocol (SOAP) 1.1," 08 May 2000.

[SOAP12]

M. Gudgin, et al, "SOAP Version 1.2 Part 1: Messaging Framework," June 2003.

[UDDIAPI20]

D. Ehnebuske, et al, "UDDI Version 2.04 API," July 2002.

[UDDIDataStructure20]

D. Ehnebuske, et al, "UDDI Version 2.03 Data Structure Reference," July 2002.

[UDDI30]

T. Bellwood, et al, "UDDI Version 3.0," July 2002.

[WS-PolicyAttachment]

D. Box, et al, "Web Services Policy Attachment (WS-PolicyAttachment)," September 2004.

[WS-Security]

A. Nadalin, et al, "Web Services Security: SOAP Message Security 1.0 (WS-Security 2004)," March 2004.

[WS-SecurityPolicy]

G. Della-Libera, et al, "Web Services Security Policy Language (WS-SecurityPolicy)," December 2002.

[WSDL]

E. Christensen, et al, "Web Services Description Language (WSDL) 1.1," March 2001.

[XML-NS]

T. Bray, et al, "Namespaces in XML," January 1999.

[XMLSchema1]

D. Beech, et al, "XML Schema Part 1: Structures," May 2001.

[XMLSignature]

D. Eastlake, et al, "XML-Signature Syntax and Processing," February 2002.

 

 

版权所有:UML软件工程组织