好几天没写这一系列了。工作原因。。。
前面几篇:
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可能会其它方式来存储用户信息和角色信息。
之前我们做过一个项目是用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表中增加自己的定义字段,比如一些用户头像或者是自己的商业相关的字段。
这种设计非常方便以后的修改,特别是字段的长度已经正则表达式,显示顺序等都可以在表中定义: