文章
面向服务的架构
作者:Ronald van Luttikhuizen 和 Jens Peters
本案例研究探讨了如何运用 Oracle Web Services Manager 保护 Oracle Service Bus 公开的 Web 服务与用 Microsoft .NET 和 Silverlight 构建的员工门户之间的交互。
下载
Oracle Web Services Manager
Oracle Service Bus
还记得 Web 服务新推出时那段激动人心的日子吗?从最初起,Web 服务便承诺提供与底层平台和工具集之间“真正”的互操作性和独立性。当时的供应商推出了各种工具来创建和使用 Web 服务,但很多 WS-* 标准尚未完全成熟。那种真正的互操作性并未得到立即实现也就不足为奇了。在旧式普通 Web 服务中,客户端往往使用相同的工具集,因此其集成基本不会出现问题。但如果用于生成 Web 服务的技术与客户端所用技术截然不同,特别是在应用了一种或多种 WS-* 标准(WS-Security)的情况下,Web 服务的使用就会成为一场噩梦。
我们已经看到,由于对标准的实现不同、所支持标准的版本不同、采用的编码不同等原因,Java Web 服务无法轻易集成 .NET 客户端(或者反之)。一种补救措施是不使用工具去生成 Web 服务构件,而是手动构建 Web 服务提供者或使用者,但这使标准带来的附加值消失殆尽:通过工具支持开发,从而简化和加速开发。幸运的是,WS-* 标准、WS-Interoperability 等一致性测试和工具集日渐成熟。如今,真正互操作性的承诺比五年或者十年前更为真实可及。
在这篇文章中,我们将介绍一个案例研究。在这个案例研究中,使用 Microsoft .NET 框架和 Silverlight 构建的员工门户应用程序将使用 Oracle Service Bus (OSB) 公开的 Web 服务。毋庸置疑,这个场景涉及两种截然不同的复杂工具集之间的 Web 服务交互。本文介绍了如何实现这些工具集之间的首次联系,如何利用 Oracle Web Services Manager (OWSM) 以声明式方法保护所公开的 Web 服务,门户应用程序如何与这些受保护的服务进行交互。
本案例研究基于荷兰的一个公共部门项目。这个项目的主要目标是提高组织 IT 环境的灵活性和敏捷性,从而简化组织及其 IT 系统在未来的更改。为实现此目标所开展的工作是:逐步改造应用程序架构,从一组“杂而不精”的孤岛式应用程序,转变为由可重用、易集成的构建块(或服务)组成的环境,保证每种构建块(或服务)都有着明确而专一的目标。这些构建块可以是新型商业级现成 (COTS) 组件、定制开发的全新服务,也可以是现有组件。
图 1 给出了新应用程序架构及其组件的简化视图。Oracle Service Bus(蓝色)将后端系统(黄色)的功能作为 Web 服务公开,而专有协议和数据格式等基本细节则由总线“隐藏”。这些通用构建块的示例包括:
所公开的这些服务供经过重新设计的业务流程使用和重用,例如授权和许可使用 Oracle SOA Suite(红色)实施的流程、供员工用于支持组织业务流程的门户应用程序。门户是用 Microsoft .NET 和 Silverlight(绿色)构建的。

未来的系统(如基于 Web 的客户门户和其他业务流程)应该重用相同的服务。这些系统的底层技术尚不可知,因此服务必须具备互操作能力,必须提供卓越的服务质量,包括充分的安全性。
孤岛式、单一化的系统有许多值得商榷的方面:它们难于更改、难以管理,分析起来非常复杂,集成和重用也非常繁琐。然而,从安全性的角度来看,将所有数据和功能并入较大的单一系统或许是最简单的做法。数据和功能都位于一处。只要能有效地保护这个系统,数据和功能的安全就能得到保证。在 SOA 环境中,数据和功能划分为不同的小块,这些块本身简单而灵活,能够轻易更改和集成。但这也有着一定的副作用,也就是说,与仅包含少数单一应用程序的架构相比,服务间传输的消息以及传入和传出组织的消息要更多。这就需要从不同的角度思考安全性。下面列举了面向服务可能对安全性产生影响的几个具体方面:
IT 系统的安全性往往是在传输层或应用层实现的。传输安全性机制的示例包括利用 SSL(或者 TLS)对传输中的消息执行加密和签名,并实施身份验证 — 例如,利用双向 SSL。仅仅使用传输级安全性的缺点是“静止数据”未得到保护。在 ESB 和 BPM 平台等中间组件内处理的消息可能就属于这种情况。使用消息级安全性时,消息本身将被加密、签名,并可能包含身份验证和授权信息。在这些情况下,在此类中间组件内存储或处理的数据也能得到保护。讨论传输级和消息级安全性的文章和图书数不胜数,本文不再赘述。
Oracle Web Services Manager (OWSM) 提供了一种基于策略(或者代理)的安全性框架,用以实现服务的安全性需求。这意味着安全性功能将以声明式方法添加到服务提供者和客户端,完全不需要定制编码和部署。OWSM 提供了数十种现成可用的策略,能满足大多数常见安全性需求。这些策略划分为以下几类:
这些策略提供的功能包括:
有关受支持策略的完整列表,请查看 Web 服务安全性和管理员指南。
OWSM 主要在消息级实现安全性,传输级安全可利用 OWSM 和服务运行在的 Oracle WebLogic Server 中的 SSL 支持实现。
如需添加和配置策略,可以在设计时使用 Oracle JDeveloper 或 Oracle Enterprise Pack for Eclipse 完成,也可以在运行时通过 Oracle Enterprise Manager 或 Oracle Service Bus Console 完成。Oracle Enterprise Manager 可用于监视策略以及检查违反这些策略的情况 — 例如,使用了错误的用户名/口令组合。可将策略应用于不同的服务实现,如 SOA 组合、OSB 服务和 Oracle WebLogic Server 中运行的普通 JAX-WS Web 服务。
图 2 再次展示了 DocumentService,员工门户调用了此服务。但这一次使用现成可用的 oracle/wss_username_token_service_policy 策略实施基于 WS-Security 用户名令牌的身份验证来保护服务。oracle/log_policy 策略用于记录发送给 DocumentService 的全部请求和响应消息,以备审计时使用。DocumentService 的实现保持不变,策略是通过配置应用的。使用者不会注意到这些策略的具体情况。

如图所示,可将多个策略结合起来,满足更加复杂的安全性需求。如果现成的策略不足以满足需求,OWSM 也提供了一种扩展机制,支持使用 Java 开发定制策略。
OWSM 集成在 Oracle WebLogic Server 之中,使用该平台提供的安全性 API。这就意味着,OWSM 能将身份验证和授权委托给 WebLogic 已配置的提供者,例如 Oracle Internet Directory (OID)、Oracle Access Manager 或其他任何符合 LDAP 的产品。
让我们再来看一下案例研究。对于门户与所公开服务之间的交互,我们确定了以下安全性需求:
传输级安全性或消息级安全性均可满足这些需求。在本例中,我们将使用 WS-Security 用户名令牌执行身份验证,使用 SSL 执行传输级机密性。
本文的后续几节将介绍如何使用 OWSM 保护 Web 服务,如何在使用 Microsoft Silverlight 开发的应用程序内调用此类受保护的服务。
“HelloWorld”演示展示的案例包含以下步骤,后续几节将详细加以介绍:
这一节介绍了如何在 OSB 运行在的托管服务器上启用 SSL,还列举了使用 Oracle Service Bus Console 应用 OWSM 策略的步骤。
我们需要实现传输级安全性,因此必须确保托管服务器支持 SSL。
请注意,Oracle WebLogic Server 默认为对于单向和双向 SSL 均使用其演示身份、信任存储及其包含的证书。用于生产时,最好使用包含受信任的证书颁发机构发行的密钥和证书的“真实”密钥库取代演示存储,不要使用自签名的证书。
要将 OWSM 与 OSB 配合使用,先决条件之一就是在包含 OWSM 和 MDS 的 Oracle WebLogic 域中安装和配置 OSB。使用 OEPE(在设计时)或 Service Bus Console(在运行时),对 OSB 公开的 Web 服务应用 OSWM 策略只是小事一桩。在这个案例中,我们使用的是运行时控制台。

注:有时候,“Process WS-Security Header”设置可能并未显示。在这个案例中,我们注意到 WSDL 和 XSD 文件中的某些非 ASCII 字符(例如文档元素中)导致了这样的行为。从 WSDL 和 XSD 文件中删除这些字符即可解决问题。

我们所应用的策略使用明文的用户名/口令组合,因此并未提供最高安全性。某些替代性策略使用口令散列方法或身份验证令牌。此外,也可以应用消息级签名和加密。但对于这个演示案例来说,这种策略提供的安全性级别便已足够,这里的主要考虑事项是互操作性,所以我们还是选择了这种策略。此外,由于 SSL 是在传输级别上应用的,因此通过网络传输的凭证不会使用明文形式。
下面的代码段给出了 SOAP 消息的示例,其中包含的用户名/口令组合作为 WS-Security 用户名令牌。
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<Security s:mustUnderstand="1" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-
wss-wssecurity-utility-1.0.xsd" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-
wssecurity-secext-1.0.xsd">
<UsernameToken u:Id="7fba817f-4406-4a23-a65e-98e1df2b3e0d">
<Username>weblogic</Username>
<Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-
profile-1.0#PasswordText">weblogic1</Password>
</UsernameToken>
</Security>
</s:Header>
<s:Body>
<GreetingRequestMessage xmlns="http://www.example.org/HelloWorld/">
<in xmlns="">Hello World !</in>
</GreetingRequestMessage>
</s:Body>
</s:Envelope>
Oracle WebLogic Server 使用基于文件的默认身份验证程序执行身份验证和授权。Oracle WebLogic Server 可配置为将身份验证委托给现有 Oracle Internet Directory (OID),只需将 OID 配置为主身份验证提供者即可。通过这种方式,即可根据符合 LDAP 的 OID 验证请求消息中 WS-Security 标头提供的用户名/口令组合。

服务器端(SSL 和 WSS)的必要步骤至此结束。现在即可测试受保护的服务,之后再深入探讨服务的使用者方面。
使用 soapUI 测试受保护的 Web 服务与测试未受保护的 Web 服务区别不大。

对受保护的服务执行测试之后,我们继续进行客户端方面的配置。
以下几个小节介绍了如何创建 Silverlight 应用程序来使用 Oracle Service Bus 公开的受保护 Web 服务。此外还介绍了如何为 Silverlight 应用程序添加 WS-Security 标头并启用 SSL。这些步骤也适用于“常规”.NET Windows Communication Foundation (WCF) 应用程序。
Microsoft Silverlight 这个平台主要用于创建基于 Web 的应用程序。Silverlight 需要一个类似于 Adobe Flash 或 Java Applet 的浏览器插件,而非 HTML 5 或基于服务器的框架,例如呈现 HTML 和 CSS 的 ASP.NET、JSP 和 JSF。对于已在 Microsoft 平台上运行的企业来说,Microsoft Silverlight 是创建“内部网”业务应用程序的理想选择。
Silverlight 基于 .NET 框架。Silverlight 框架继承了 .NET 许多广为人知的类和命名空间。Windows Communication Foundation 是 .NET 平台中进程间通信的事实标准。因此,Silverlight 使用“轻 WCF”访问 Web 服务。
在 Silverlight 解决方案中,Web 服务器不会与后端 Web 服务通信。Silverlight 应用程序在浏览器中运行,直接调用服务而非“传统”的 ASP、JSP 或者 JSF Web 应用程序。这意味着 Web 服务请求可以来自广泛的客户机,而非仅限于一两台服务器。在这种架构中,基于访问控制的标准安全性(例如,基于 IP 编号)的效果较差,因为没有任何中央 Web 服务器作为 OSB 服务的固定客户端。
请注意,考虑到存在安全性风险(例如跨站点脚本编写或者跨域伪造),默认情况下不允许将不在相同源域或源站点(子域、协议和端口)中运行的 Web 服务作为 Silverlight 应用程序调用。如果 Silverlight 应用程序在 Oracle Service Bus 以外的某个域中运行;或者 Silverlight 应用程序的访问是通过 HTTP 执行的,但 Web 服务调用通过 HTTPS 执行时,就会发生这种情况。由于存在这些安全性考虑,因此我们需要对环境加以配置,允许 Silverlight 应用程序与 Web 服务之间的通信。
必须注意,在此类情况下,强烈建议首先分析相关的安全性风险和考虑事项,并采取恰当的措施,之后再启用跨域访问。有许多资源提供了有关安全性需求和措施的信息,例如 Oracle 技术网中的安全性指南。
与 Adobe Flash 相似,Microsoft Silverlight 也能事先处理托管 Web 服务的服务器根中的 clientaccesspolicy.xml 或 crossdomain.xml 配置文件,之后再允许与实际的 Web 服务通信。此类配置文件用于管理 Web 服务访问。由于 Oracle Service Bus 是在 Oracle WebLogic Server 之上运行的,因此我们将创建一个简单的 WebLogic Web Application,它唯一的任务就是托管 clientaccesspolicy.xml 文件。有关跨域访问的具体背景信息,可参阅 Microsoft MSDN Library 内的 Silverlight 中的网络与 Web 服务。

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="SOAPAction">
<domain uri="http://*" />
<domain uri="https://*" />
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
请注意,此策略文件允许从任意位置进行访问。在真实环境中,建议相应地修改此项策略(使之更加严格)。
添加该文件后,Eclipse 中的项目应如图 9 所示。




务必牢记,我们应用的 OWSM 策略会以明文形式在网络上发送 WSS 用户名/口令组合。使用“PasswordText”时,Silverlight 强制使用 HTTPS 而非 HTTP [6]。如果通过 HTTP 发送明文口令,那么添加这些 WSS 标头以实施安全性的目标就不可能实现。
下一步是将服务器(本案例中即 Oracle WebLogic Server)使用的证书导入运行 Silverlight 应用程序的浏览器。可使用 JDK 包含的 keytool 实用工具,从 WebLogic 密钥库中获取证书。有关更多信息,请参阅保护 Oracle WebLogic Server。

应该注意,只要使用了无效证书,浏览器就会报告证书信任问题 — 尝试调用 Web 服务时,您会看到 Silverlight 中为人诟病的跨域错误。
接下来使用 Visual Studio 创建 Silverlight 应用程序。
请参阅 Microsoft MSDN Library 中的方法文档:新建 Silverlight 项目和方法文档:添加、更新或删除服务引用,进一步了解创建 Silverlight 项目和创建 Web 服务客户端的具体步骤。
接下来,我们需要修改已生成的 Web 服务绑定,以便将 WSS 消息凭证添加到出站 SOAP 调用,确保通过 HTTPS 调用 Web 服务。如前文所述,Silverlight 使用 WFC 子集执行 Web 服务交互。WCF 支持 WS-Security 用户名令牌标准 [6]。
我们可以在 Visual Studio 中编辑 Web 服务绑定配置,添加以下代码段,以便实现这种配置:
<customBinding>
<binding name="BasicWsSecurity">
<security authenticationMode="UserNameOverTransport" includeTimestamp="false"/>
<textMessageEncoding messageVersion="Soap11"/>
<httpsTransport/>
</binding>
</customBinding>
接下来,我们需要使用填充 WS-Security 标头所用的 ClientCredentials 属性,设置用户名和口令。需要对每个 Web 服务代理执行一次这样的设置:
HelloWorldClient client = new HelloWorldClient("HelloWorldSOAP_BasicWsSecurity");
client.ClientCredentials.UserName.UserName = "weblogic";
client.ClientCredentials.UserName.Password = "weblogic1";
至此一切设置完成,接下来即可运行 Silverlight 应用程序,调用 OSB 公开的受保护 Web 服务。

Silverlight 应用程序显示了来自受保护 Web 服务的响应消息!
若能集成异构平台,例如 Oracle 和 Microsoft 的工具体系,WS-Security 等可互操作标准的附加值就能展露无遗。Oracle Web Services Manager (OWSM) 是 Oracle 用于保护服务和业务流程的主要工具,它能应用和实施 SSL、WS-Security 和 SAML 等标准。这是通过一种无需编码的声明式方法完成的,策略(或代理)将在运行时应用以提供必要的安全性。OWSM 提供了数十种预定义的策略,可直接应用于 Oracle SOA Suite、OSB 和 Oracle WebLogic Server(JAX-WS Web 服务)公开的 Web 服务。
本文介绍了如何为 Oracle Service Bus 公开的 Web 服务应用 OWSM 策略,以及如何在用 Microsoft Silverlight 构建的 Web 应用程序中使用此类 Web 服务。Silverlight 与 Windows Communication Foundation (WCF) 密切相关,而后者支持 WS-Security。
应用安全性措施并不容易。可以屏蔽与安全性相关的错误消息,避免敏感信息(例如平台版本、堆栈跟踪、必要的安全性配置等)对外泄露,此外也可以加密有效负载。但这会导致受保护环境中的调试更加困难。
幸运的是,有许多非常有用的工具能帮助我们实施和测试安全性。其中包括:
通常情况下,各种标准都会留出一定的解释空间,很少有供应商能严密实施标准。实际集成 Oracle 平台和 Microsoft 平台这类截然不同的技术时,总是存在一些迷思。请参阅 Oracle Web Services Manager 互操作性指南,拨开迷雾。
Ronald van Luttikhuizen 是 Vennster 的执行合伙人和架构师,还是 Oracle ACE 的总监。
![]()
Jens Peters 是 Microsoft 认证金牌合作伙伴 One Fox 的一位技术架构师。![]()