一个Web应用系统包含了诸多功能,如果只单一的加固每个功能模块的安全性,只能使得系统的安全性支离破碎。为了实现应用系统整体的安全性,开发人员需要明确编程语言的安全技术各个部分是如何相互协作的。
本书讨论的Web应用系统的安全模型包括:ASP.NET、企业服务和Web服务,下面就逐一介绍每个组成部分的安全性。
ASP.NET用于实现用户界面服务。通过将已验证的凭据或它们的表示形式与某些内容进行比较,ASP.NET可以控制对站点信息的访问。这些内容可以是NTFS文件系统权限,也可以是列出了已授权用户、已授权角色(组)或已授权的XML文件。
ASP.NET身份验证模式包括匿名、Windows、Passport和窗体身份验证。
有时,窗体身份验证只用于Web站点的个性化处理。在这种情况下,几乎不用编写任何自定义代码,因为ASP.NET用简单的配置自动处理这一过程的大部分工作。在个性化处理方案中,Cookie只需要保留用户名即可。窗体身份验证以明文形式向Web服务器发送用户名和密码。因此,应该将窗体身份验证与SSL保护的信道结合使用。为了对后续请求中传输的身份验证Cookie不间断地提供保护,应该考虑在应用程序内的所有页上使用SSL。
IIS提供的身份验证机制分为如下几种:
企业服务(Enterprise Services)为应用程序提供基础结构级的服务,主要包括分布式事务和资源管理服务。
如图1-2所示的企业服务应用程序使用RPC方式对调用方进行身份验证。也就是采取特定的步骤禁用身份验证;否则就应该使用Kerberos或NTLM对调用程序进行身份验证。
图1-2 企业服务架构
授权是通过企业服务(COM+)角色提供的,这些角色可以包含操作系统组或用户账户。角色成员身份在COM+目录内定义并利用“组件服务”工具进行管理。如果客户端(如ASP.NET的Web应用程序)在服务组件上调用某个方法,企业服务侦听层在身份验证进程结束后访问COM+目录以确定该客户端的角色成员身份,然后检查该角色是否允许授权访问当前的应用程序、组件、接口和方法。
Web服务通过使用SOAP消息在防火墙之间或跨平台系统之间移动数据来实现数据的交换和应用程序逻辑方法的远程调用。
Web服务的安全性主要包括平台/传输级(P2P)安全性、应用程序级(自定义)安全性、Remoting安全性、ADO.NET安全性、Internet协议安全性和安全套接字层。
两个终结点之间的传输通道(Web服务客户端和Web服务之间)可以用于提供点对点的安全性,如图1-3所示。
图1-3 平台/传输级安全性
应用程序使用自定义的SOAP标头传递用户凭据,以便根据每个Web服务请求对用户进行身份验证。常用的方法是在SOAP标头中传递身份验证票。
应用程序可以灵活生成其包含角色的IPrincipal对象。该对象可以是自定义类或.NET框架提供的GenericPrincipal类。应用程序可以有选择地加密需要保密的内容,但是这需要使用安全密钥存储。
另一种方法是使用SSL提供机密性和完整性,并将它与自定义的SOAP标头结合起来执行身份验证。
Remoting技术可以跨越进程和机器边界访问分布式对象。使用Remoting技术和ASP.NET应用程序客户端时,就会在Web应用程序和远程对象主机上进行身份验证。
当Remoting技术在ASP.NET中应用时,可以使用HTTP通道在客户端代理和服务器之间传递方法,包括IIS身份验证和ASP.NET身份验证。
当Remoting技术在Windows服务中应用时,可以使用TCP通道在客户端和服务器之间传递方法调用,它使用基于套接字的原始通信方法。
ADO.NET是专门为分布式Web应用程序设计的,它的安全性主要包括SQL Server外盾、Windows验证和ASP.NET验证。
SQL Server外盾守卫需要保存数据库连接字符串,登录数据库并获取关联的数据库角色,其过程如图1-4所示。
图1-4 ADO.NET外盾机制
使用Windows身份验证从ASP.NET应用程序连接到SQL Server时,可以采用ASP.NET进程标识,也可以采用固定标识。通常的做法是在Web服务器上将密码更改为某个已知值来配置本地ASP.NET进程标识,然后在数据库服务器上通过创建具有相同用户名和密码的本地用户创建镜像账户。
Internet协议安全性提供了一种传输层安全通信解决方案,可以保护如应用程序服务器和数据库服务器之间的数据传递,通过对两台计算机之间发送的所有数据进行加密来提供消息的保密性,同时在两台计算机之间提供相互的身份验证。
安全套接字层(Secure Sockets Layer)提供点对点的安全通信信道。通过该信道传输的数据都是经过加密的。SSL技术最常用于保护浏览器和Web服务器之间的信道,也可以用于保护往返于运行数据库服务器和Web服务器之间的消息。
使用SSL时,客户端使用HTTP协议并指定一个URL,而服务器在TCP端口900上侦听。由于SSL使用复杂的加密功能来对数据进行加密和解密,因此对应用程序的性能会产生影响,所以应该优化使用SSL的页面。