BlogEngine.NET 源码点滴(2)

来源:互联网 发布:java多线程之间通信 编辑:程序博客网 时间:2024/05/21 19:37

BlogEngine中使用的安全技术

BlogEngine中用的什么框架做安全呢?看看其Web.config就知道了。

没错,还是.NET 2.0自带的Membership,这个东西网上讲得实在太多了,就不多说了。要注意的是BlogEngine使用了两个自定义的Provider,一个是XmlMembershipProvider,用在使用XML格式作为数据源的情况下。另外一个是DBMembershipProvider,用在除了SQL Server的其他数据库的情况下,例如Oracle。

首先注意BlogEngine对Admin目录的访问限制是通过配置web.config的方式实现的。可以查看Admin/Web.config的内容如下:

意味着必须是登陆用户才可以访问。其次在Admin/Pages/Web.config中可以看到以下内容:

这里对具体每一个页面的Role访问进行了限制。这里是BlogEngine通过路径的形式对具体的物理页面进行安全控制。

而在具体操作中,如果需要权限检查的话呢?打开BlogBasePage文件,在OnPreInit函数中有如下代码:

这里的意思很清楚了,首先用户得登陆了,其次要么是作者,要么是管理员才可以删除这个东东。这里引用的方法是:Page.User.Identity.IsAuthenticated。

打开BusinessBase文件,有如下片段:

这里引用的方法是Thread.CurrentPrincipal.Identity.IsAuthenticated。可能有人会奇怪了,为什么采用两种不同的方式引用呢?其实都是一个东西,上面一种引用到最后也是Thread里头的这个东西。无非是在Page里头已经给你包装好了,引用User逻辑上也更符合上下文环境。而Thread里头这个东西具体是什么,下面会有分析。

总的来说,BlogEngine中使用安全认证的方法就是以上几种。每一种其实大家都很容易用到。尤其是最后一种方法,很多情况下没有Page的引用的时候,就不知道该如何实现认证的功能了。其实最简单的就是Thread了,随时随地,方便好用。

自定义MemberShip(XML,General DB)

先来说说Provider到底是个啥东西。

现在很流行这个东西啊,有事没事就要来个“可扩展性”。动不动就要支持多种数据库,多钟数据源。到底Provider是啥意思呢?举个例子吧,本人有一台主机,上面只有sql server 2005,因此本人写的代码都是基于sql server的。但是因为本人的东西朋友看了眼馋,也想用,可惜他的机器是linux的,只有oracle,那咋办?只能凉拌了。可是如果我告诉你,我的代码是可分离的,也就是说,凡是与数据库相关的代码,都只是一个接口而已。(别告诉我你不知道什么是接口)。我自己实现了这些接口,当然是用sql server的东东实现的。而你想要用我的东西,那么你就用你的oracle的东东实现这个接口好了,与数据库无关的代码你就不用重写了。实现好了以后,我在配置文件中写上“本人用Oracle”,替代以前在我的机器上跑时写的“本人用Sql Server”,就可以了。这就是两个Providers。一个是for oracle,一个是for sql server。

回到BlogEngine,同样的概念,除了.net自带的标准的用于sql server的Provider外,自定义了两个,一个用于XML格式,一个用于其他数据库的情形。举个例子看看,RoleManager中由一个函数接口:

在XMLProvider中的实现是:

而在DBProvider中的实现则是:

&(&*@#,妈呀,差别咋这么大呢?所以最后到底程序执行哪一段代码,就取决于你配置文件中写的Provider是谁了哈。

另外一个需要提醒的是,你不必实现接口中所有的函数,只需要实现你会用得到的即可。其他的空着也无所谓。例如XmlProvider中的GetPassword函数就没有实现:

待续……

IIdentity, IPrincipal的概念既作用

……

拓展MemberShipUser

……

原创粉丝点击