Vincent的备忘录

  博客园  :: 首页  ::  :: 联系 :: 订阅 订阅  :: 管理

WSE策略框架

WSE 策略框架

WSE 策略框架描述了与 ASMXASP.NET Web 服务框架)或 WSE Web 服务进行通信的约束和要求。策略是一个部署时概念。策略的一个实例转换成运行时组件,这些组件在发送方应用这些要求,或者在接收方执行这些要求。在客户端和服务之间交换任何消息之前,发生此转换过程(称为策略编译)。

原子运行时组件被称作 SOAP 筛选器,它们在单个 SOAP 信封级别运行。它们主要负责检查或转换 SOAP 信封。例如,发送方的 SOAP 筛选器可能会对消息进行数字签名并为其添加一个 Security 标头,像 WS-Security 规范中定义的那样。同样,接收方的 SOAP 筛选器可以从 SOAP 信封中提取 Security 标头,并要求在将消息分配到应用程序代码之前成功验证它包含的数字签名。

一个策略包含一个有序的策略断言列表。每个策略断言定义一个对 Web 服务的要求。两个对应的运行时组件执行这些要求。在图 1 中,策略和策略断言部署时概念分别对应于管线和 SOAP 筛选器运行时概念。例如,策略中要求的顺序允许描述身份验证要求的断言在描述授权要求的断言之前生效,这样就可以在授权执行期间使用调用方的身份(在身份验证过程中确定)。策略内策略断言的顺序控制了运行时应用或执行有关要求的顺序。图 1 显示策略编译在管线中如何按照 SOAP 筛选器的顺序来保存表示成策略断言的要求的顺序。

 


1
通过 SOAP 筛选器的断言实现的策略

在策略编译过程中,每个策略断言最多可以生成四个 SOAP 筛选器。每个 SOAP 筛选器在不同的请求/响应消息交换阶段执行。两个不同的 SOAP 筛选器处理客户端上的输入消息和输出消息,两个筛选器处理服务上的输入消息和输出消息。策略断言生成的 SOAP 筛选器遵循策略中断言的顺序。用一个管线来表示这个输入筛选器和输出筛选器的集合。

虽然一个策略断言最多可以创建四个 SOAP 筛选器,但并非所有表示为策略断言的要求都需要请求/响应消息模式中所有这四个挂钩点。例如,重播检测要求只需要两个 SOAP 筛选器,用于客户端和服务上的传入消息。在这种情况下,不需要对传出消息进行特殊处理。

策略对象模型

PolicyAssertion 抽象基类声明了四个用于创建 SOAPFilters 的方法。执行这些方法可以处理客户端或服务上的请求或响应。在运行时,将调用其中两个方法(调用哪两个方法取决于策略断言应用于客户端还是服务)为管线提供 SOAPFilters。这些方法中的任何一个都可能返回空,这表示断言在消息交换的这个点上不需要任何处理。 
               

public abstract class PolicyAssertion {
  
public abstract SOAPFilter CreateClientInputFilter(FilterCreationContext context);
  
public abstract SOAPFilter CreateClientOutputFilter(FilterCreationContext context);
  
public abstract SOAPFilter CreateServiceInputFilter(FilterCreationContext context);
  
public abstract SOAPFilter CreateServiceInputFilter(FilterCreationContext context);
  . . .
}


SOAPFilter 是一个运行时类,负责 SOAP 消息的原子转换。其约定非常简单:必须实现的唯一方法接受对 SOAPEnvelope 进行检查或转换,并且返回 SOAPFilterResultSOAPFilterResult 指明管线应继续处理还是终止。该终止功能仅在涉及处理基础结构消息的高级方案(例如,WS-Reliability 协议消息)中有用,不能直接分配到 Web 服务类: 

public abstract class SOAPFilter
{
  
public abstract SOAPFilterResult ProcessMessage(SOAPEnvelope envelope);
  . . .
}


       PolicyAssertion 被安排在 Policy 类实例中,以捕获某个服务或代理所要求的需求集。然后,该 Policy 可以充当创建客户端管线或服务管线的工厂,如下所示:

public class Policy : IPipelineProvider
{
  
public Collection Assertions {get;}
  
public Policy(params Assertion[] assertions) {}
  
public Pipeline CreateClientPipeline(PipelineCreationContext context) {}
  
public Pipeline CreateServicePipeline(PipelineCreationContext context) {}
}


       Pipeline 类代表已排序的 SOAPFilter 对象集合,用于处理传入消息或传出消息。同样,Pipeline 可用于自定义服务或服务代理的运行时行为。

应用策略

WSE 中的策略可在代码中以命令方式定义,也可以在外部 XML 文件中以声明方式定义。这两种方法都解决特定的情况。在代码中以命令方式定义策略时,您可以完全控制对为了使用服务而需要满足的要求进行的定义。分发编译的应用程序时,管理员不能更改这些要求。

XML 文件中声明策略解决相反的情况:开发人员在代码中只提供应用程序逻辑,将指定策略要求的责任委托给管理员。当策略要求依赖于部署环境且不能在开发时确定时,该方法很有用。例如,同一个 Web 服务可以向 Windows 域和 Internet 的用户公开。在 Windows 域中,安全要求可以使用 Kerberos。同时,在 Internet 上可使用用户名/密码和 X.509 证书。

WSE 定义了一个 PolicyAttribute,该属性可添加到一个代表 ASMX Web 服务或服务代理的类中以应用特定策略:

[WebService]
[Policy(
"HelloWorldPolicy")]
public class HelloWorld : WebService
{
  [WebMethod]
  
public string Hello(string request)
  {
    
return String.Format("Hello {0}", request);
  }
}


   在本示例中,名为 HelloWorldPolicy 的策略应用于 HelloWorld Web 服务。在应用程序域中首次实例化服务类时,WSE 运行库将该策略名称解析为一个 Policy 实例,该实例在配置文件中引用的 XML 文件中声明。然后,该 Policy 实例将编译到一个包括传入消息和传出消息的 SOAPFilters 的管线中。所有指向该 ASMX Web 服务的 SOAP 请求和响应将通过该管线得到处理。Web 方法作用域不支持 PolicyAttribute

配置文件中提供包含策略声明的 XML 文件的名称,如下所示:

<configuration>
  
<Microsoft.Web.Service3>
    
<policy filename="policies.config" />
  
</Microsoft.Web.Service3>
</configuration>


   包含策略的 XML 文件的架构允许您声明任意数量的命名策略。这就允许同一个应用程序域中(因此共享一个配置文件)运行的不同服务使用不同的策略。例如,该 policies.config 文件包含 HelloWorldPolicy Policy17 这两个策略的定义,如下所示:

<policies xmlns="http://schemas.microsoft.com/WSE/2005/06/policy">
  
<policy name="HelloWorldPolicy">
    
<usernameForCertificateSecurity />
  
</policy>
  
<policy name="Policy17">
    
<kerberosSecurity />
  
</policy>
</policies>


   每个策略只有一个策略断言:一个使用 usernameForCertificateSecurity 断言,另一个使用 kerberosSecurity 断言。这两个断言内置在 WSE 3.0 中,并且提供额外的配置选项。

PolicyAttribute 还可用于将策略应用于客户端上的服务代理。通过在代表 ASMX 代理的类上添加属性,可以实现该目的。然而,ASMX 代理类通常是用 Visual Studio 环境的添加 Web 引用功能或 wsdl.exe 工具自动生成的。这样,每次重新生成 PolicyAttribute 时,都必须将其添加到该类中,这很不方便。因此,将策略分配给客户端代理的推荐方式是调用其上的 SetPolicy 方法,如下所示:

HelloWorld serviceProxy = new HelloWorld();
serviceProxy.SetPolicy(
"HelloWorldPolicy");

SetPolicy 是由 WebServicesClientProtocol 类提供的,ASMX 代理类(在本示例中是 HelloWorld)必须从该类派生。WSE Visual Studio 环境的添加 Web 引用功能紧密集成,从而确保所有新生成的 ASMX 代理类都是针对支持 WSE 的项目从 WebServicesClientProtocol 派生的。

posted on 2006-06-15 12:51  Vincent.Hu  阅读(539)  评论(1)    收藏  举报