老赵点滴


  先做人,再做技术人员,最后做程序员。
  我的理想:“让外国人看中国人写的技术书籍和文章”。Try as I might
posts - 290, comments - 10829, trackbacks - 154, articles - 6
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

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

Posted on 2007-07-25 02:32 Jeffrey Zhao 阅读(5945) 评论(31)  编辑 收藏 所属分类: WCF

前言

  对于一个应用程序来说,最重要的特性之一就是安全性。例如,安全方面的需求往往会最早被提出,安全方面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就能够解决开发中的大部分的问题。

Feedback

#1楼 [楼主]   回复  引用  查看    

2007-07-25 02:35 by Jeffrey Zhao      
唉,本想画一幅示意图,结果花了整整半个小时还是画不好。

#2楼    回复  引用    

2007-07-25 07:18 by zzz [未注册用户]
睡的好迟啊。。。
突然发现老赵的个人信息改了。

#3楼    回复  引用  查看    

2007-07-25 07:50 by GoGoSonny      
又开始WCF研究啦?厉害~

#4楼    回复  引用  查看    

2007-07-25 08:06 by Join miao      
每次都写这么长! :-)

#5楼 [楼主]   回复  引用  查看    

2007-07-25 09:46 by Jeffrey Zhao      
@GoGoSonny
其实自从正式版开始就在看了。其实我只是AJAX方面写的多一些,但是我在这之前之后乃至现在的工作都是作.NET平台下的开发,所以接触的东西许许多多,其实是从数据库到系统管理一条龙,呵呵。AJAX只是能够让我有些特别的想法,别的东西,好像知道了也就知道了……:)

#6楼 [楼主]   回复  引用  查看    

2007-07-25 09:46 by Jeffrey Zhao      
@zzz
我的个人信息?

#7楼    回复  引用    

2007-07-25 10:05 by sdf [未注册用户]
@Jeffrey Zhao
@Join miao

#8楼    回复  引用    

2007-07-25 10:07 by zzz [未注册用户]
啊。可能我看错了。似乎以前没发现有“洋名”这么幽默的字眼。
不好意思。。。

#9楼 [楼主]   回复  引用  查看    

2007-07-25 10:31 by Jeffrey Zhao      
@Join miao
我用1400*1050的分辨率看就不多了,如果用更大的显示器就更少了,呵呵。

#10楼 [楼主]   回复  引用  查看    

2007-07-25 10:31 by Jeffrey Zhao      
@zzz
:)

#11楼    回复  引用    

2007-07-25 23:52 by William Cui [未注册用户]
hi jeffrey,

我最近正在新产品中设计类似概念的一个轻量级框架,深刻认识到安全性必须是在架构层面上充分考虑进去的。也看了一些Ajax安全性这方面的东西,挺想知道Asp.Net Ajax是如何考虑的?比如XSS、XSF、JavaScript JSON、中间人、重放攻击等等?还有类似基于REST的Ajax怎么考虑有状态会话跟踪、权限验证?

regards,
william

#12楼    回复  引用  查看    

2007-07-26 17:08 by 王克伟      
这么晚了还没睡啊,作为我们大学生这么晚了没有睡觉,不是打游戏就是看电影:)现在我知道你年轻有为的原因了,经常能看到你的评论,看来你一直奋斗着呀,我们年轻一辈都要你这种精神呀!向你学习吃苦耐劳的作风:)

#13楼    回复  引用    

2007-07-30 10:28 by 怪怪 [未注册用户]
提个醒,也许你理解事物的方向反了?

"我个人非常注重模型,也就是一个框架是如何抽象外部事物的,例如ASP.NET如何将HTTP请求抽象成WebForm"

这句话大大的有问题。外部事物才是抽象的,外部事物通过接口传入对象,WebForm是这个接口的具体化。按照我老爹10年前给我上的课,对于调用者来说,这叫伸进口袋摸球。

WCF你说的这些我还没看过,不了解,不过是不是装饰器,要看有没有装饰器的特征。不同的模式之间本来就是差不多,尤其是核心思想是一致的。比如你说的这种方式,也符合响应链的一个变种。这个就期待你详细研究后给大家上课了。

另外给路过的用LHS B3开发的兄弟说一声,不要装VS08 B2,前两天和Scott还有Bash沟通了一下,确认有严重的BUG,安装了你就啥也别想顺利干了,还得卸载.

搞笑的是跟Bash来回扯了几次皮条,隔了至少24小时他才承认安装程序有BUG. 中间还跟我说LHS的.NET Framework版本不对(往其它小组身上赖?希望没耽误他的奖金...)。即使有这个因素吧,版本不对是客观,没考虑到不照样是安装程序的BUG?要不是对微软的东西还是有一定熟悉程度,还真被他给忽悠了...

#14楼    回复  引用    

2007-07-30 10:31 by 怪怪 [未注册用户]
不过这个理解的方向问题,也许你也有你的道理。这个我倒是琢磨过,每个人最好按照自己的思维方式去理解问题最快(除了我这样没思维的),到最后肯定是殊途同归..

#15楼 [楼主]   回复  引用  查看    

2007-07-30 11:07 by Jeffrey Zhao      
@怪怪
我的理解是,WebForm是一种模型,程序员就能够使用这种模型来操作外部事物,WebForm就是把外部事物抽象成了一个模型。

#16楼    回复  引用    

2007-07-30 11:41 by 怪怪 [未注册用户]
明白你说的意思 :) ,这个层面上不用争执,就是我说的,怎么思考能让自己有效工作最重要~~ javaeye上就竟是这些东西,看着都烦。

#17楼    回复  引用    

2007-07-30 15:46 by 江湖小弟 [未注册用户]
vs2008 有什么问题啊,还能直说阿?

#18楼    回复  引用  查看    

2007-07-30 21:18 by Leepy      
提外话!
求助,请问你培训讲座里面的视频录制是用什么工具来录制的?
有个朋友要问!

#19楼 [楼主]   回复  引用  查看    

2007-07-30 23:07 by Jeffrey Zhao      
@Leepy
Adobe Captivate

#20楼    回复  引用    

2007-08-01 06:45 by 怪怪 [未注册用户]
@江湖小弟
没看明白啥意思.., 是有问题MS不能直说? 还是少了个字, 说我"不能直说"?要是后者, 是这样的:

LHS B3上完全成功安装了VS 08 B2以后, 包括VS05/IIS7和VS08自己, 会意图从错误的DLL中读取各种类型, 比如想从System.Web.DLL里读ScriptManager甚至你自定义的一些类, 这样很多页面都不能正常执行. 对于VS 08的开发环境更要命, 连Repeater这样的都无法正确解析, 所以反应完全不正常.

目前他们的小组号称没有任何Workaround, 本来我觉得有方法解决, 不过活儿紧, 没空替微软做这种无聊的试验了.... 这个问题没有在XP/Vista/2003上发现, 据Bash跟我说是因为LHS B3自带的.NET Framework 2.0是错误的版本, 不过我觉得是在瞎说...

#21楼    回复  引用  查看    

2007-08-03 16:34 by 南方小鬼      
我也装上了VS2008,希望不要影响我的2005,手头上有东西,不要出乱子

#22楼    回复  引用    

2007-08-07 11:41 by 翻译公司 [未注册用户]
上海天虹翻译有限公司是上海知名品牌翻译公司。优质、守时、诚信是我们公司的服务理念,也是我们公司成功的重要保证。
天虹翻译公司网址:www.tianhongsh.com
我们的目标:打造中国翻译第一品牌。

#23楼    回复  引用    

2007-08-09 23:44 by 大傻子大傻子 [未注册用户]
我靠,老赵你真是牛人,文章太棒了,我就喜欢看同行的技术剖析文章。感觉现在技术改头换面速度太快,05没有坐热,08就来了,我还没用过07,faint,打开08一看,我靠吓一跳,多了n多东西,傻了!(不过话说回来,net的演进是连续的,持续开发的学习强度其实也不很大。。)

估计很多新程序员都不知道这些都是干什么的,呵呵。你说的“一开始必须“死记硬背”或者对照着Sample Code才能写出代码”听起来很亲切!!

帅,看见同行就是亲切!!!

备注,我是马甸的大傻子程序员。

#24楼 [楼主]   回复  引用  查看    

2007-08-10 00:16 by Jeffrey Zhao      
@大傻子大傻子
客气了。

#25楼    回复  引用    

2007-08-12 11:30 by 阿三 [未注册用户]
赵大哥,看你这么厉害真是好钦佩,我想好好学习JAVASCRIPT,请问你能帮我推荐几本好书吗?我什么基础都没有!

谢谢!

#26楼 [楼主]   回复  引用  查看    

2007-08-12 13:02 by Jeffrey Zhao      
@阿三
看Professional JavaScript for Web Developers吧。:)

#27楼    回复  引用  查看    

2007-08-12 15:35 by 邓林海      
好东西

#28楼    回复  引用    

2007-09-03 03:52 by ie [未注册用户]
疯狂学习中。

#29楼    回复  引用    

2007-09-29 13:32 by fa [未注册用户]
老赵,能否给我推荐你本外国的asp。net的书籍,我有一定的开发基础,现在觉得提高很难,能告诉我下来在么做?

#30楼 [楼主]   回复  引用  查看    

2007-09-29 22:19 by Jeffrey Zhao      
@fa
强烈推荐Advanced Topics这本,呵呵。

#31楼    回复  引用    

2008-05-09 19:21 by tiantang419 [未注册用户]
强烈期待下一篇。。
毕业设计要用WCF,我负责安全这块,现在只会在客户端和服务端分别配置证书连接,好多迷糊的地方...

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-07-25 14:16 编辑过


相关链接: