Fork me on GitHub
DotNetNuke 5 C#版本解读之3--DNN Membership
 好几天没写这一系列了。工作原因。。。
前面几篇:
1.  DotNetNuke 5 C#版本解读之1--架构介绍 
2. DotNetNuke 5 C#版本解读之2--HTTP Modules
Asp.net Membership说明:
对于asp.net的开发人员来说asp.net membership 是再熟悉不过的了。相信很多项目中你都在使用membership来管理用户,权限组等。它是在.net framework 2.0
中开始加入的。
在framework 3.5中进行了安全性增强,目前它主要有如下几个功能:
1. 用户登录控件等。2.用户管理。3。Membership Provider和Roles Provider。
这些控件都已经在.net framework中封装好了。
                              
如果你对membership不是很了解,提供你如下几篇文章,供参考:
http://msdn.microsoft.com/en-us/library/yh26yfzy.aspx 
http://www.sosuo8.com/article/show.asp?id=850&page=0
http://www.silverlightshow.net/items/Leveraging-the-ASP.NET-Membership-in-Silverlight.aspx
http://mvcmembership.codeplex.com/
 

你在安装DNN时会有一步是选择你的membership provider是使用SQL Server还Active Directory,默认是SQL Server。

 

DNN的Membership介绍:

当然DNN本身的数据结构以及它的一些Services注定了它不能直接使用.net提供的Membership。

1.    Portals 应用程序:

DNN允许一个站点上有多个portal,每个portal都有自己的用户和角色管理,portal的唯一标识是PortalID。默认的.net membership/Roles Porvider它并不支持多个portal各自拥有自己的用户和角色管理。

DNN开发团队于是想到了一个办法解决这个问题,就是让DNN的每个portal作为一个虚拟的Application使用。当像Membership/Roles Provider发送请求时,传递过去的参数是PortalID,这样就能够得到当前这个portal自己的Users和Roles。代码如下;

 

2.    Users和Roles的数据模型

如果完全使用Membership/Roles Provider,那么用户和角色管理的信息就必须和DNN的应用程序的一些配置数据存储分离,Membership需要有自己的数据存储。例如:DNN可能是使用SQL Server作为他的数据库来存储数据和一些配置等,但是Membership/Roles Provider可能会其它方式来存储用户信息和角色信息。

之前我们做过一个项目是用DNN3.3.4的,客户要求使用Windows认证,所以当时就为了能够让DNN本地的密码和AD域的密码能同时被初始化而花费了客户一笔钱做SSO。数据访问层你如果想让DNN的数据和membership的数据同时更新,是比较麻烦的。 而在DNN后来的版本中,商业逻辑层的修改让上面那些担心都不必要了。

  DNN的user信息表等不能Membership的user信息表取代是因为这些表和其它的表关联非常大。比如在User表中有个UserID字段,它是用来标示用户唯一的。基本上这个字段在DNN的所有核心模块中都有用到。所以你如果现在完全使用Membership的权限管理而放弃DNN的User表,意味着整个核心模块都得修改。。。最终的解决方案是让DNN的表对应到Membership/Roles Provider的表,如下图:

 

3.    Membership, Roles和Profile Providers

DNN5默认的使用ASP.NET SqlMembershipProvider使用的功能确实是System.Web.Security.Membership命名空间中的功能,但是它没有直接调用这里的方法而是调用了在DotNetNuke.Security.Membership这个命名空间中的SqlMembershipProvider方法。它是在原来的Membership方法基础上增加了让asp.net的表和DNN的表直接数据同步的功能。

1.  Membership Provider:

Membership Provider的功能是与存储过程通信,能够把新增,删除,用户身份认证和更改密码。DNN的Membership Provider是继承了System.Web.Security下面的Membership类。Cs文件位置如下:

 

主要的方法如下:

 

 

属性如下:

 

这些属性的值可以再web.config中的membership节点部分配置:

<membership defaultProvider="AspNetSqlMembershipProvider"

userIsOnlineTimeWindow="15">

<providers>

<clear />

<add name="AspNetSqlMembershipProvider"

type="System.Web.Security.SqlMembershipProvider"

connectionStringName="SiteSqlServer"

enablePasswordRetrieval="true"

enablePasswordReset="true"

requiresQuestionAndAnswer="false"

minRequiredPasswordLength="7"

minRequiredNonalphanumericCharacters="0"

requiresUniqueEmail="false"

passwordFormat="Encrypted"

applicationName="DotNetNuke"

description="Stores and retrieves membership data from the local

Microsoft SQL Server database" />

</providers>

</membership>

2.  Role provider:

Role Provider提供的功能主要是增加,删除一个role,为某个role添加或是删除user等。

 

在web.config中你可以配置role provider的路径:

<roles defaultProvider="DNNRoleProvider">

<providers>

<clear />

<add name="DNNRoleProvider"

type="DotNetNuke.Security.Membership.DNNRoleProvider,

DotNetNuke.Provider.DNNProvider"

providerPath="∼\Providers\MembershipProviders\DNNMembershipProvider\"

/>

</providers>

</roles>

 

如果你有自己的Role provider只需要更改这里的路径。

3.  Profile Provider:

这个Provider主要是用来把用户的信息用存储过程存储到数据库,并能够通过用户的ID得到用户的信息,以方便admin权限的用户管理用户。

DNN5以前的版本中,Profile的属性都在web.config中配置,但是到了5有了改变,它新增了一个表叫ProfilePropertyDefinition。

你如果想定义自己的Profile Provider,你可以在ProfilePropertyDefinition表中增加自己的定义字段,比如一些用户头像或者是自己的商业相关的字段。

这种设计非常方便以后的修改,特别是字段的长度已经正则表达式,显示顺序等都可以在表中定义:

 

 

 

posted on 2010-08-29 01:35  HackerVirus  阅读(382)  评论(0编辑  收藏  举报