彭斌

[ 2006,2007 ASP.NET ' MVP ]
随笔 - 99, 文章 - 5, 评论 - 1027, 引用 - 16
数据加载中……

Community Server专题十:MemberRole之RoleManager

 

Community Server专题十:MemberRoleRoleManager

由于最近忙于一些琐事,近半个月都没有写新的专题,今天忙里抽闲赶紧补上,实在是抱歉。

 

设计做多了就会发现,用户权限管理是一个永恒的话题,几乎没有什么项目不需要权限和角色管理的,可能会无数次去写角色管理的代码,而且会根据项目的不同粒度也会有所不同。在CS中,采用了MemberRole.dll中的RoleManager进行角色管理,该角色管理机制同样在asp.net 2.0 beta2 中得到应用。在分析代码之前先看看数据库中的角色的关系表:

表分两种前缀,一种是“aspnet_”另一种是“cs_”,“aspnet_”是采用MemberRole.dll组件所必需的一些表,包括过程和视图等都是这样命名的,在asp.net 2.0 beta2 中你也可以看到同样的表、视图与储存过程。“cs_”前缀是CS系统需要的表,由此可以看到MemberRole.dll中的RoleManager只管理到角色级别,通常我们还会给角色添加一些权限,然后在应用系统中判断角色拥有的权限从而决定用户是否有访问的权限,当然一个用户可以有多个角色,一个角色又可以有多个权限。有时你设计的某些系统是不需要做如此多权限管理的,只要多个角色就可以解决问题,那么就不再需要扩展数据库,直接使用MemberRole.dll中的RoleManager就可以了。

注意:你可能会对cs_SectionPermissionscs_ProductPermissions表产生疑惑,这里有两个权限表,分别管理两种权限,cs_SectionPermissions中存储节点级别的权限,如Blog中,是否有权限开通blog,管理所有blog等,这些权限就放在cs_SectionPermissions,但是对于每个blog,如我的blog,现在不想要某个用户访问,或者需要某个用户帮忙管理,再或者某个地方某些用户可以访问,某些不行,这样的权限就放入cs_ProductPermissions中设置。

RoleManager是一个HttpModule,由此可以在web.config中看到如下的配置文件:

 

<add name="RoleManager" type="Microsoft.ScalableHosting.Security.RoleManagerModule, MemberRole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b7c773fb104e7562" />

 

这也是RoleManager角色管理的入口点,同时,在RoleManager中实现了IConfigurationSectionHandler接口,用来读取Web.config中的以下配置:

        

<roleManager 

              
cacheRolesInCookie="true" cookieName=".CSRoles" cookieTimeout="90"

              cookiePath
="/"  cookieRequireSSL="false" cookieSlidingExpiration="true" 

              createPersistentCookie
="true" cookieProtection="All" maxCachedResults="1000" >

              
<providers>

                   
<add

                       
name="CommunityServerSqlProvider"

                       type
="CommunityServer.Components.CSRoleProvider, CommunityServer.Components"

                       connectionStringName
="SiteSqlServer"

                       applicationName
="dev"

                       description
="Stores and retrieves roles data from the local Microsoft SQL Server database" 

                   
/>

              
</providers>

     
</roleManager>     

再这里我们又看到了Provider模型,其实asp.net 2.0 beta2中大量使用了这种数据访问模型。它的优点我在前面的专题中已经讲解过,不理解的朋友可以看我之前的专题。

RoleManager很重要的一个类就是:

该类继承至IPrincipal,因此我们可以在用户登录后通过检查当前ContextUser的一些方法和属性,判断拥护是否拥有某角色。操作的方法在RoleMangerModule类下的OnEnter下:

OnEnter方法

由于知识点比较简单, MSDN上也有相关的IPrincipalIdentity的介绍,我就不细细的分析。

RoleManger里,很多地方使用了Cookie,这样做提高了不少的效率,你想,如果每个用户每次访问一个页面都去读一次数据库,把该访问用户的权限读取出来,也许你聪明点,把该用户的权限先缓存在内存中,并且设置一定的过期时间,其实你还能再聪明一点,那就是把角色保存在客户端的Cookie,这样连服务器的内存都节约了。只有在用户第一次登录,或者清除了CookieCookie失效的情况下才需要访问数据库。但是这也带来一个问题,就是如果客户端禁止使用Cookie,用户将无法正常访问。CS中通过在web.config中可以配置是否启用这种机制。

 

到这里,整个MemberRole.dll算是粗略的讲解了一遍,由于时间上的限制不可能满足所有读者的要求,如果有疑问可以msn我或者给我留言。后面一些专题我将说说CS的页面,包括MasterPageThemeSkin等机制。

posted on 2005-10-10 08:53 彭斌 阅读(4425) 评论(13)  编辑 收藏 网摘 所属分类: CommunityServer

评论

#1楼   回复  引用    

一直想看你寫的Community Server專題。只是自已太忙,有時間一定看。
先支持一下!
2005-10-10 10:53 | 極速[未注册用户]

#2楼   回复  引用    

接着看!
2005-10-10 11:42 | wngwz.w[未注册用户]

#3楼   回复  引用  查看    

最近在学习CS,看了您的专题,收获很大,希望您能继续写下去。
2005-10-11 10:32 | 旺旺      

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

近期推出系列asp.net 2.0 与CS相关联的主题,主要是一些在CS的特性在asp.net 2.0中也应用的文章。
2005-10-11 11:07 | uGoer      

#5楼   回复  引用    

写的很好,想和你探讨下权限。


把你的msn告诉我。


我的msn :wzx2855@hotmail.com
2005-10-17 19:38 | wang2855[未注册用户]

#6楼   回复  引用    

请问:
cs_SectionPermissions
中SettingsID有什么用?
2005-10-27 10:00 | kzi

#7楼   回复  引用    

希望共同探讨~

msn : denghe@hotmail.com
2005-11-25 16:18 | denghe[未注册用户]

#8楼   回复  引用  查看    

看了你的专题收获很大

谢谢

希望有更多的专题。:)
2005-12-14 13:14 | ekeen      

#9楼   回复  引用    

写得太好了!
在微软的数据库中有一个appnet_paths表是作什么用的?谢谢
2005-12-24 11:02 | ysh2001[未注册用户]

#10楼   回复  引用    

我看完了你目前所有的关于CS专题
非常感谢作者
您的专题让我学到很多东西,非常感谢.
2005-12-24 12:00 | uimeet[未注册用户]

#11楼   回复  引用    

写得太好了! 楼主真是高人.

#12楼   回复  引用    

“其实你还能再聪明一点,那就是把角色保存在客户端的Cookie”
把角色保存在Cookie后,如何取得该用户的角色啊???
Roles.IsUserInRole()只能判断是否在该角色。
2007-06-07 17:06 | zzzzz[未注册用户]

#13楼   回复  引用  查看    

IPrincipal 可以写当前线程关联的。。。cs也没完全按ms的模型来做。。
可能是为了和1.1兼容。

在cs中,所有需要配置权根的类都继承自Section
PermissionBase 封装了权限操作和验证。

如 blog :
public class BlogPermission:PermissionBase
{
...
}
从数据库里读出来的权限设置就保存在这里

Section.ValidatePermissions 这里提供了一个代理,用来验证权限
2007-10-06 10:48 | 潇笑      



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 251301




相关文章:

相关链接: