很难想象在当今环境的商业应用中有比安全还要严重的一个方面。性能和可用性也是主要关注的,但对一些偶尔需要安全(事实上,相比带来的价值来说可能更加有害)的应用程序是没有太多价值的。当我们使用在线银行服务时,我们相信应用服务提供商已经尽他们最大努力来阻止滥用,数据崩溃,攻击以及将我们的财务信息暴露给其他人。当我们向使用者提供基于WCF的服务时也有同样的要求。
这一章主要关注安全背后的概念和一些使用WCF来让服务变得安全(当必要时)的实践。我们将通过介绍主要概念开始,然后我们进入详细部分,伴随着很多例子的介绍。
在对概念描述以后,为了与本章节剩余部分一起工作而提供了必须的背景内容,我们开始介绍创建并使用安全服务证书。那就是说,我们将从传输和消息方面描述确保安全的背后细节。
本章的绝大部分聚焦于安全服务在常见场景中的实际应用。被分别列入为两个开放的组,局域网模型和因特网环境。
最后,我们通过介绍如何使能WCF中允许我们跟踪和诊断涉及调用我们服务操作的调用者的权限和认证问题的安全审计特性来结束本章。
WCF 安全概念
在我们处理实现安全服务的代码,配置文件和进程之前,让我们通过介绍4个主要的服务安全信条开始: 认证,授权,可信赖和完整性。通过这些定义,我们接下来将描述应用到WCF的传输安全和消息安全概念。
认证
安全最基本概念之一是知道谁在敲门。认证是为一次访问建立一个清晰身份的过程,例如,通过提供用户名和密码的证据。尽管对一个服务来说这对理解它的调用者明显是重要的,同等重要的是调用者有一个关于调用的服务是期望的而不是伪造的保证。
WCF为服务和调用者为共同认证提供几个选项-例如,证书和Windows账户和组。通过使用这些以及其他选项(我们会在这章描述),每端都可以保证它们正在与期望的部分通信。
授权
安全的下一步,就是在身份建立起来后确定是否应该允许调用端做它们请求的。这个过程称为授权因为服务或者资源授权一个调用者来操作。注意你也可以选择匿名用户来操作,所以尽管授权与认证不是严格独立,它通常是跟随认证的。
授权可以通过服务中的自定义代码实现,原有的或者自定义授权提供者,ASP.NET 规范,Windows组,活动目录,认证管理器和其他架构。
可信赖性
当处理敏感信息时,如果一次调用的结果将广播给任何感兴趣的人,那么创建身份并授权就没有多大用处。可信赖性是阻止其他人读取一个调用者和一个服务间的交换信息的概念。这通常通过加密实现,这种多样性的架构存在WCF中。
完整性
最后一个关于安全的基本概念是保证在调用者和服务端传输的消息内容没有被篡改,反之亦然。这通常通过数字签名或者为消息内容创建一个签名哈希并让接收方验证基于它接收的内容的签名值。如果计算出的值与嵌入的值不匹配,消息应该被丢弃。
注意即便私密性不是必须的也可以提供完整性。只要接收方可以通过数字签名验证保证原始数据那么以明文发送消息也是可以接受的。
传输安全和消息安全
WCF中有两个主要的安全级别;两个都是关于在一个服务端和调用端(有时称作传输安全)消息的安全性。第一个保护数据的概念是当它在网络中发送,或者”在线”。这称之为传输安全。另外一个类别称作消息安全并关注每条消息为它自己提供的保护,不考虑使用的传输架构。
为数据发送提供保护的是传输安全,不关心内容。这个场景的通用例子是使用安全套接层(SSL)来对数据包的内容进行加密和签名并通过HTTPS发送。也有其他的传输安全选项,选项将依赖于使用的特定WCF绑定。事实上,默认情况在WCF中你将看到很多选项设置为安全,比如TCP。
传输安全的一个限制是它依赖于每“步”和有一致安全配置的网络路径上的参与者。或者说,如果一条消息必须在它到达目的地前中转,那么就没有方式来保证传输安全在中转后(除非中转被原始服务提供商完全控制)也启用。如果安全不是信赖生成,数据可能也会这样。额外的,中转本身必须被信任的,不可在继续传输过程中改变消息。这些要求对通过基于互联网的路由的服务是重要的。
消息安全关注保证独立消息的完整性和私有性,不考虑网络。尽管加密和通过公钥私钥签名,消息将会被保护即便它通过非安全协议(比如普通HTTP)发送。
使用传输安全和消息安全通常通过配置文件确定;两个基本的例子在列表8.1中显示。
列表8.1 传输安全和消息安全例子
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <bindings> <basicHttpBinding> <binding name="MyBinding"> <security mode="Transport"> <transport clientCredentialType="Windows"> <extendedProtectionPolicy policyEnforcement="Never" /> </transport> </security> </binding> </basicHttpBinding> <wsHttpBinding> <binding name="MyBinding"> <security> <transport clientCredentialType="None"> <extendedProtectionPolicy policyEnforcement="Never" /> </transport> </security> </binding> </wsHttpBinding> </bindings> </system.serviceModel> </configuration>
随着你深入了解本章的过程,你讲看到使用传输安全或者消息安全例子的场景,在一些情况,会使用混合安全模式。