前言

对于一个应用程序来说,最重要的特性之一就是安全性。例如,安全方面的需求往往会最早被提出,安全方面Bug的优先级和危害程度往往都被定为最高。有时候为了提高安全性,还需要牺牲一定的性能或者其他因素。因为性能,往往可以通过一些别的方式,例如添加一台服务器作负载均衡来解决(顺便插一句,我现在觉得对于企业来说,能够用钱解决的往往就不是问题了),或者在之后的版本中进行优化;但是如果出了安全性方面的漏洞,很可能就已经造成了无法弥补的损失。试想,如果Windows Live Passport出现了安全上的漏洞导致用户信息泄露,这将会引出多大的风波,对于微软来说会造成多少名誉上的损害。但是如果性能上出现了问题——这方面例如Windows Live Space或Hotmail的早期版本都不怎么样,但是在优化之后还是吸引了大量的用户群体。
安全性是如此的重要,自然WCF也会为它提供了良好的支持,否则也无法称之为一个成熟的模型了(我认为,微软希望,也正在把WCF变成.NET或者说Windows平台下分布式通信的事实标准)。但是虽然WCF提出了丰富而强大的安全性支持,但是如果使用不当,依旧会产生安全方面的问题(同样的例子还有Sql注入,要保证安全型还是必须通过良好的编程实践来达成),甚至还不如不依赖WCF的功能,直接使用传统的方式,例如使用硬件或软件防火墙来阻止非法的连接。反过来说,选择什么样的安全实践也是要考虑到项目的实际情况。例如有的时候我们的确可以使用传统的方式来保证安全性,再今后的版本中再采用高级的实践——尤其我们现在有了WCF提供的模型,我们的优化可能只是部署一个新的程序集,然后更新一下配置而已。
近期因为项目原因重新阅读了各种资料,主要围绕着WCF在安全方面所提供的支持,同时准备在公司内部进行一些培训和交流。这一系列文章也就算是对于最近一段时间研究内容的总结吧。

Service Model和Channel Layer

WCF提出的通信模型主要可以分为两大部分:Service Model和Channel Layer。它们各司其职,“互不干涉内政”,因此能够自由地组合与扩展,使开发人员能够利用WCF提出的模型来轻松实现强大的通信功能。不过事实上,按照官方的说法,Channel Layer是Service Model的组成部分(而且官方的说法的确还是有道理啊),但是我在了解了这些内容之后还是认为将两者概念分开为好,希望能够就这方面的概念问题和大家讨论一下。
WSDL是描述一个服务的XML格式的语言。通过一个服务的WSDL我们可以得知这个服务的地址、服务使用的协议、以及服务中的各种具体定义(例如定义了哪些消息等等)。显然,如果每次生成服务时都要自己编写代码输出大段复杂的WSDL,或者在使用服务时都要解析WSDL并且在请求时还需要自己生成SOAP内容,这样的开发效率就实在是太低了。因此,成熟的框架会提供一种“抽象”机制,使开发人员能够轻松的定义服务,尽可能的将注意力集中在业务逻辑的实现上。例如使用ASP.NET释放Web Services,或者利用.NET Framework中的wsdl.exe根据某个服务的WSDL描述来生成代理。这些框架和工具都能够大大提高我们的开发效率。
WCF中的Service Model就是这样的一种抽象。简单地说,它可以被认作是一个与WSDL产生映射的模型。在Service Model中,与WSDL各部分相对应的概念被称作为address、binding和contract,这就是被各种资料中所提到的“A、B、C”。除了提供了“定义”这样的模型(用来与WSDL对应)之外,Service Model还负责了上述模型与外部请求或者回复信息的转化。
例如,我们的Host一旦接受到了一个请求,那么它会把这个请求内容反序列化成为一个Message类型的对象,并交给Service Model处理。此时Service Model开始工作,例如它会构造出处理这个请求的环境,识别出该用哪个类型来处理请求,选择或者创建一个类型的实例,确定应该调用的方法,随后调用方法,得到一个结果对象。然后Service Model同样负责将这个结果对象转化为一个Message类型的对象,最终将其序列化并输出(整个过程有十多个步骤,我这里只是提到了一些最重要并且最容易理解的环节。由此可见WCF的可扩展性是多么的强大)。如果使用WCF生成调用服务的代理,那么Service Model工作性质还是差不多,只是方向相反而已。
那么是由什么组件负责将一个外部的请求反序列化成为一个Message对象,待方法调用完成之后,又将表示结果的Message序列化成为输出的内容呢(如果使用WCF作为客户端代理,那么就变成将Message序列化为请求的内容,并且将收到的回复内容反序列化成Message对象)?这就是Channel Layer的作用。
Channel Layer定义个一个由一系列Channel组成的Stack,Message对象在穿越这个Channel Stack的时候会经过每个Channel的处理,一步步地“形变”,最终成为了我们需要“数据形态”。例如服务返回的Message对象在经过了功能为SOAP XML转化的Channel之后便成了SOAP XML的形式,然后再经由一个负责加密的Channel则成为了Encrypted数据(当然实际的步骤也没有那么简单),最终经由一个负责TCP/IP信道传送的Channel输送出去。试想,如果我们自定义一个Channel将Message转化为JSON格式,然后再使用一个Channel通过一个HTTP通道返回数据,那么不就能够支持ASP.NET AJAX的Web Service请求功能了吗?没错,的确可以这样。事实上在新的ASP.NET Futures类库中就提供了这样的组件,它们是学习如何扩展WCF的优秀范例。不过这已经是题外话了,有机会我们可以另起一个话题再说。
不过这里又要谈一下我个人的观点了,因为我对于Channel Stack的理解和官方说法有一定出入。无论从目前的官方文档,亦或是各类技术会议上谈到的Channel Layer,都是由一个一个Channel,“并列”地组合成一个Channel Stack。然后Message就像一个原材料通过生产线一样,最终得到了一个成品。
但是在我看来,Channel之间的关系不是并列的,而是使用了类似于“装饰模式”的嵌套的做法来实现的。在我看来,Channel与Channel之间是包含关系,Service Model将Message交给了最外层的Channel处理,而最外层的Channel根据它定义的某种逻辑,配合它邻近的那个下层的Channel处理的结果来操作这个Message对象,而不是简单地将处理的结果交给下一个Channel。这一点从自定义Channel的方式上就可以看出,基本上每个Channel内部都会用一个名为innerChannel的私有Field来保存下一个Channel,并且在自己的某些方法中使用innerChannel的方法。
根据我的理解可以得到一些推论,例如关闭一个Channel时,该Channel必须负责将它的innerChannel对象关闭;我们可以实现一个最简单同时无用的Channel,将所有的方法都直接委托给innerChannel,等等。而这些推论都是扩展Channel Layer的正确做法或结论,因此,我还是觉得自己的理解更加合理一些。当然,如果您在这方面有什么看法,也希望能够和您进行交流。

为什么要理解Service Model和Channel Layer?

似乎说了半天,我还没有涉及到WCF在安全方面的支持,却在大谈特谈一些“概念”。但是我认为,了解WCF的一些模型是掌握WCF的基础(我个人非常注重模型,也就是一个框架是如何抽象外部事物的,例如ASP.NET如何将HTTP请求抽象成WebForm)。只有了解了Service Model和Channel Layer的设计目的和功能,才能正确理解一些安全方面的做法是如何与这些模型结合的。例如,Channel Layer可以提供哪些安全上的保证,为什么Authentication操作是在Channel Layer中进行,而Authorization却是Service Model提供的呢?
WCF框架的设计并非随性而为,其中有着充分的理由,是那些世界顶级架构师们智慧和经验的结晶。当从“模型”的角度理解到这些内容之后,对于框架的使用往往就可以更上一层楼了。就拿我自己的经验来说,一开始必须“死记硬背”或者对照着Sample Code才能写出代码。而理解了模型之后,似乎代码或配置该怎么写,写在什么地方都是顺理成章的事情,在一些细节方面翻阅一下MSDN就能够解决开发中的大部分的问题。

转载于:https://blog.51cto.com/jeffz/59522

WCF在安全性方面的支持(1):一些概念相关推荐

  1. WCF学习之旅—实现支持REST客户端应用(二十四)

    WCF学习之旅-实现REST服务(二十二) WCF学习之旅-实现支持REST服务端应用(二十三) 在上二篇文章中简单介绍了一下RestFul与WCF支持RestFul所提供的方法,及创建一个支持RES ...

  2. Adaptation---多屏幕多分辨率的支持和一些概念

    多屏幕多分辨率的支持和一些概念 快速预览 Android 在不同的屏幕大小和密度上执行 屏幕的显示会影响用户界面的效果 系统处理大多数的自适应屏幕 你应该针对屏幕创建资源以更好的控制你的UI Andr ...

  3. [转]WCF 4 安全性和 WIF 简介

    转自:http://www.cnblogs.com/WizardWu/archive/2010/10/04/1841793.html 本帖简介 .NET 新一代的 Windows Identity F ...

  4. WCF 4 安全性和 WIF 简介

    本帖简介 .NET 新一代的 Windows Identity Foundation (WIF) 框架,及其与 WCF 的协同运用.文后提供两本 WCF 4 书籍.一本 WIF 书籍的下载地址,及许多 ...

  5. ×××网络连接安全性以及协议支持介绍

    增强的安全性 目前×××网络连接主要采用四项技术来保证数据通信安全,这四项技术分别是隧道技术(Tunneling).加解密技术(Encryption & Decryption).密钥管理技术( ...

  6. 多屏幕多分辨率的支持和一些概念

    Android 是一个系统,运行在这个系统上的很多设备它们的屏幕大小和密度都不一样.但我们需要解决这个问题.本节为详细的为你解释一些基础概念和教你怎么处理关于多屏幕多分辨率的支持. 虽然系统会根据不同 ...

  7. WCF系统内置绑定列表与系统绑定所支持的功能

      WCF系统内置绑定列表 绑定 配置元素 说明 传输协议 编码格式 BasicHttpBinding <basicHttpBnding> 一个绑定,适用于与符合 WS-Basic Pro ...

  8. [WCF编程]1.WCF入门示例

    一.WCF是什么? Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,整合了原有的windows通讯的 .net Remotin ...

  9. 【转】利用WCF的双工通信

    Silverlight与WCF之间的通信(2)利用WCF的双工通信"推送"给SL数据 作者:Leon Weng  来源:博客园  发布时间:2010-06-19 23:43  阅读 ...

最新文章

  1. 线上分享会预告之三维模型检索技术介绍
  2. mysql备份数据库语句6_13.4 MySQL用户管理;13.5 常用sql语句;13.6 MySQL数据库备份恢复...
  3. 当个新手很幸福!网络创业之新手小白一样可以吸粉又赚钱
  4. 菜鸟学Linux 第090篇笔记 corosync+drbd+mysql
  5. TIME_WAIT和CLOSE_WAIT状态
  6. Firefox3.0火速前进 比2.0版快2到3倍
  7. 如何快速是DNS修改生效
  8. 第二章作业第2题--苏志华
  9. 一台计算机连入计算机网络后通过该计算机,一台计算机连入计算机网络后,该计算机( )。...
  10. 数据加密密钥 分发_分发加密软件可能违反法律
  11. linq to access 简单实现
  12. 关于hibernate的一些小记
  13. swift 实践- 05 -- UITextField
  14. android桌面 vulkan,Vulkan 设计指南
  15. 「CH2401」送礼物 解题报告
  16. NFTFi赛道版图概览
  17. 软件安全 实验 2 软件动态、静态分析技术 TraceMe.exe OllyDbg IDA
  18. 解除B站区域限制 油猴脚本
  19. WAYZ维智疾控AI分析平台WDCIP: 空间大数据和AI位置智能技术助力疫情防控 |百万人学AI评选
  20. 如何打造一篇优秀的简历

热门文章

  1. Redis进阶-缓存问题
  2. 再谈 Linux下的nanosleep函数
  3. 知乎高赞 | Go 技术一面一般考哪些内容
  4. 怎么把一个Java应用打包成Docker镜像
  5. CSS 笔记——盒子模型
  6. Bootstrap3基础 clearfix pull-left/right 辅助类样式 快速左右浮动
  7. Linux服务器安全防护十个方面
  8. Unity中所有特殊的文件夹
  9. Android的xml/assets/raw资源使用具体解释
  10. Multiple methods named 'status' found with mismatched result, parameter type or attributes