随笔-74  评论-365  文章-17  trackbacks-6

        近期由于身心不适,一直没更新,现又拿起笔,继续这个系列……
 
         CS中的用户及权限管理是比较复杂的,了解其中的用户及权限有关的机制对掌握CS的核心是至关重要的,现就对CS中的用户管理机制作一个简要介绍。
         CS是在Asp.Net1.1时代出现的,固然,在CS1系列中使用的权限机制是建立在微软MemberRole1.0之上的,那么在CS2中仍然沿袭了这一模块。不过我们可以看到CS2针对ASP1.1和Asp2.0做了两套方案,这样我们就可以在.net1.1状态下用MemberRole1.0在.net2.0状态下用ASP.NET2.0自带的MemberRole。那么CS2中是怎样做到这么灵活的配置的呢,下面就一一道来:
         前面一系列的文章提到在CS2中运用的一种很常见的模式-代理模式,代理模式诸多优点我就不在这里细说了,最突出的那就是可以在自己的规则里使用第三方组建,而不会直接依赖第三方组建,当第三方组建变动的时候,只需要改代理层即可,同样,在CS2处理MemberRole的时候也用到了此模式,下面我们就看看此模式带来了什么。
         让我们先来看看CommunityServerComponents这个项目,这个项目为CS的核心,里面定义了CS运行所需要的抽象类、接口、公用方法、实体类等等,显然要定义MemberRole的接口当然也应该在此定义了,这也符合接口倒置原则,接口的使用者定义接口,而不是提供者。打开项目里的\Components\Provider\User\文件夹,此文件夹内就是全部接口的定义和调用规则了:


        上图调用MemberRole组建的所有接口定义,可以看出这里除了MemberRoleProfileProvider这个抽象类有实体方法外,其他都为接口定义,调用的时候当然是调用MemberRoleProfileProvider里面的实体方法了,这里的方法告诉我们通过配置找到需要加载的代理组建并适时加载:
static MemberRoleProfileProvider()
        {
            
                CSConfiguration config 
= CSConfiguration.GetConfig();
                Provider provider 
= config.Providers["MemberRoleProfileProvider"as Provider;
                
if(provider != null)
                {
                    
if(Globals.IsNullorEmpty(provider.Type))
                        
throw new Exception("MemberUserRoleProvider provider found, but no type attribute was specified");

                    Type type 
= Type.GetType(provider.Type);
                    
if(type == null)
                        
throw new Exception(string.Format("MemberUserRoleProvider Provider Type {0} could not be loaded",provider.Type));

                    murp 
= Activator.CreateInstance(type) as MemberRoleProfileProvider;
                    
if(murp == null)
                        
throw new Exception("MemberUserRoleProvider could not be loaded from the type " + provider.Type);
                }
        }

        这个静态方法就是为了完成此项工作的了。
配置节点在CommunityServer.config里的providers的MemberRoleProfileProvider,这就告诉CS2需要使用哪个代理来处理MemberRole。
<add 
                    
name = "MemberRoleProfileProvider"
                    type 
= "CommunityServer.MemberRole.CSMemberRoleProfileProvider, CommunityServer.MemberRole"
                
/>
    好了,看完了接口我们不难猜到代理层应该做什么了,当然是实现这些接口了:

        我们可以看到在CS2中有两个MemberRole代理层,一个是针对MemberRole1的,另一个则是针对ASP.NET2.0的MemberRole,这两个组件我们选择一个就行,具体选择什么我们就在配置文件里填上相应的组件的代理程序集(也就是上图显示的项目)就OK了,因为他们都正确的实现了CS定义的接口,需要说明的是,CS2默认使用MemberRole1.0,如果需要使用Asp.net2.0中的MemberRole则还需要运行项目里面的SQL脚本升级数据库。现在我们着重看看CommunityServer.MemberRole这个实现了MemberRole1.0的代理层:


        这里我们可以看到,在主要的CSMemberRoleProfileProvider里只引用了CSRoles、CSProfiles、CSMembership,那么其余的实现MemberRole怎样知道呢,这就需要在WEB.config中进行指定,打开WEB.config文件我们可以看到在configSections节点有如下的配置:
<sectionGroup name="memberrolesprototype">
            
<section name="membership" type="Microsoft.ScalableHosting.Configuration.MembershipConfigHandler, MemberRole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b7c773fb104e7562" />
            
<section name="roleManager" type="Microsoft.ScalableHosting.Configuration.RolesConfigHandler, MemberRole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b7c773fb104e7562" />
            
<section name="profile" type="Microsoft.ScalableHosting.Configuration.ProfileConfigHandler, MemberRole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b7c773fb104e7562" />
            
<section name="anonymousIdentification" type="Microsoft.ScalableHosting.Configuration.AnonymousIdConfigHandler, MemberRole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b7c773fb104e7562" />
        
</sectionGroup>

还有在profile节点的
<providers>
                
<add name="CommunityServerSqlProvider" type="CommunityServer.MemberRole.CSProfileProvider, CommunityServer.MemberRole" connectionStringName="SiteSqlServer" applicationName="dev" description="Stores and retrieves profile data from the local Microsoft SQL Server database" />
            
</providers>

        这些就是告诉系统需要怎样调用MemberRole了
        通过配置好上面的各项,就可以在系统里实现其基本的用户管理了,当然我们会看到CS2在处理用户管理的时候还做了非常多的工作,这也不是一时半会儿能讨论清楚的,先在这里抛砖一下,更多高级应用还得需要大家慢慢体会。
posted on 2006-06-07 23:51 dragonpro 阅读(3049) 评论(6)  编辑 收藏 所属分类: 编程/技术

评论:
#1楼  2006-06-08 10:07 | sm160.com      
老哥, 你这个UML图是用什么工具画的? 真的很不错啊.
  回复  引用  查看    
#2楼  2006-06-08 10:12 | 徐灿钊Asp.net专栏      
vsts自带的。
  回复  引用  查看    
#3楼  2006-06-10 23:37 | miniflyfish      
谢谢Felix,此系列对我帮助很大,你要多注意身体呀,多休息,劳逸结合!
  回复  引用  查看    
#4楼  2006-07-09 01:45 | 666.NET      
能否讲述转换成ASP.NET2.0MemberRole的详细过程,我试了一下失败了.谢谢!
  回复  引用  查看    
#5楼  2006-08-10 23:59 | pcvc      
如何将cs2.0升级到标准的.Net2.0 MemberShip ?

http://cs.998118.com/forums/thread/30085.html
  回复  引用  查看    
#6楼  2007-04-24 16:14 | studycs [未注册用户]
求 楼主,帮我一下吧
我想把CS2.0中的用户资料存放在自己定义的表中,就是在注册用户的时候让那些字段统统插到自己的表中,我重写了MEMBERSHIPPROVIDER方法
在CommunityServer.ASPNet20MemberRole程序集下建立了一个cMemberShipProvider类里面的 代码是:
namespace CommunityServer.ASPNet20MemberRole
{
using System;
using System.Web.Security;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
public class cMemberShipProvider :MembershipProvider
{
public override string ApplicationName
{
get
{
throw new Exception("The method or operation is not implemented.");
}
set
{
throw new Exception("The method or operation is not implemented.");
}
} public override void UpdateUser(MembershipUser user)
{
throw new Exception("The method or operation is not implemented.");
}

public override bool ValidateUser(string username, string password)
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["SiteSqlServer"]))
{
SqlCommand comm = new SqlCommand("custom_Validateuser", conn);
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.Add("@name", SqlDbType.NVarChar, 12).Value = username;
comm.Parameters.Add("@password", SqlDbType.NVarChar, 32).Value = password;
conn.Open();
using (SqlDataReader reader = comm.ExecuteReader())
{
if (reader.Read())
{
return true;
}

return false;
}
}
}
public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["SiteSqlServer"]))
{
SqlCommand comm = new SqlCommand("custom_MemberShipCreateuser", conn);
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.Add("@name", SqlDbType.NVarChar, 12).Value = username;
comm.Parameters.Add("@password", SqlDbType.NVarChar, 32).Value = password;
comm.Parameters.Add("@emali", SqlDbType.NVarChar, 50).Value = email;
conn.Open();
comm.ExecuteNonQuery();
conn.Close();
}
throw new Exception("The method or operation is not implemented.");
}
}
}
我想先试一下,所以CreateUser方法简单写了
在WEB.CONFIG里配置
<membership userIsOnlineTimeWindow="15" defaultProvider="cMemberShipProvider">
<providers>
<clear />
<add name="cMemberShipProvider"
type="CommunityServer.ASPNet20MemberRole.cMemberShipProvider, CommunityServer.ASPNet20MemberRole"
connectionStringName="SiteSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="false"
requiresUniqueEmail="true"
passwordFormat="Hashed"
applicationName="dev"
description="Stores and retrieves membership data from the local Microsoft SQL Server database"
maxInvalidPasswordAttempts="999"
passwordAttemptWindow="999"
minRequiredPasswordLength="6"
minRequiredNonalphanumericCharacters="0" />
</providers>
</membership>
出现的错误是:分析器错误信息: 未能从程序集“CommunityServer.ASPNet20MemberRole”中加载类型“CommunityServer.ASPNet20MemberRole.cMemberShipProvider”。
源错误:
行 92: <clear />
行 93: <add name="cMemberShipProvider"
行 94: type="CommunityServer.ASPNet20MemberRole.cMemberShipProvider, CommunityServer.ASPNet20MemberRole"
行 95: connectionStringName="SiteSqlServer"
行 96: enablePasswordRetrieval="false"

请问我怎么写才能实现从自己的表中读写数据呢? 由于内容太长了,不能发表,所以不重写的方法就删掉了
TKY
  回复  引用    

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


相关链接:
 
Free Web Counter