因为之前安装vs.net 2005时没有安装MS提供的SQL Server 2005 Express,所以在使用Membership 和Roles疲费了些周折。
         笔者是采用SQL Server 2000 数据库,如果要使用Membership,需要在"Visual Studio 2005 命令提示"窗口中在指定数据库中,注册Membership 相关表,例aspnet_regsql -E -S "localhost" -A m,如果要使用Roles,同样注册
aspnet_regsql -E -S "localhost" -A r,有关aspnet_regsql详细命令可键入aspnet_regsql/?得到。
         建立好数据库后,然后需要配置web.config了,如下

ASP.Net 2.0 中MemberShip和Role的分布存储问题<!-- roleManager -->
ASP.Net 2.0 中MemberShip和Role的分布存储问题    
<roleManager defaultProvider="SqlProvider" 
ASP.Net 2.0 中MemberShip和Role的分布存储问题      enabled
="true"
ASP.Net 2.0 中MemberShip和Role的分布存储问题      cacheRolesInCookie
="true"
ASP.Net 2.0 中MemberShip和Role的分布存储问题      cookieName
=".ASPROLES"
ASP.Net 2.0 中MemberShip和Role的分布存储问题      cookieTimeout
="30"
ASP.Net 2.0 中MemberShip和Role的分布存储问题      cookiePath
="/"
ASP.Net 2.0 中MemberShip和Role的分布存储问题      cookieRequireSSL
="false"
ASP.Net 2.0 中MemberShip和Role的分布存储问题      cookieSlidingExpiration
="true"
ASP.Net 2.0 中MemberShip和Role的分布存储问题      cookieProtection
="All" >
ASP.Net 2.0 中MemberShip和Role的分布存储问题      
<providers>
ASP.Net 2.0 中MemberShip和Role的分布存储问题        
<clear />
ASP.Net 2.0 中MemberShip和Role的分布存储问题        
<add 
ASP.Net 2.0 中MemberShip和Role的分布存储问题           
name="SqlProvider" 
ASP.Net 2.0 中MemberShip和Role的分布存储问题           connectionStringName
="MySqlConnection" 
ASP.Net 2.0 中MemberShip和Role的分布存储问题           applicationName
="RoleManager" 
ASP.Net 2.0 中MemberShip和Role的分布存储问题           type
="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />ASP.Net 2.0 中MemberShip和Role的分布存储问题     
       
</providers>
ASP.Net 2.0 中MemberShip和Role的分布存储问题    
</roleManager>
ASP.Net 2.0 中MemberShip和Role的分布存储问题    
<!--role Manager end-->
ASP.Net 2.0 中MemberShip和Role的分布存储问题    
ASP.Net 2.0 中MemberShip和Role的分布存储问题    
<!-- Membership -->
ASP.Net 2.0 中MemberShip和Role的分布存储问题    
<membership defaultProvider="SqlProvider" userIsOnlineTimeWindow="15">
ASP.Net 2.0 中MemberShip和Role的分布存储问题            
<providers>
ASP.Net 2.0 中MemberShip和Role的分布存储问题                
<clear/>
ASP.Net 2.0 中MemberShip和Role的分布存储问题                
<add 
ASP.Net 2.0 中MemberShip和Role的分布存储问题          
name="SqlProvider" 
ASP.Net 2.0 中MemberShip和Role的分布存储问题          type
="System.Web.Security.SqlMembershipProvider" 
ASP.Net 2.0 中MemberShip和Role的分布存储问题          connectionStringName
="MySqlConnection" 
ASP.Net 2.0 中MemberShip和Role的分布存储问题          applicationName
="Membership" 
ASP.Net 2.0 中MemberShip和Role的分布存储问题          enablePasswordRetrieval
="false" 
ASP.Net 2.0 中MemberShip和Role的分布存储问题          enablePasswordReset
="true" 
ASP.Net 2.0 中MemberShip和Role的分布存储问题          requiresQuestionAndAnswer
="true" 
ASP.Net 2.0 中MemberShip和Role的分布存储问题          requiresUniqueEmail
="true" 
ASP.Net 2.0 中MemberShip和Role的分布存储问题          passwordFormat
="Hashed"/>
ASP.Net 2.0 中MemberShip和Role的分布存储问题            
</providers>
ASP.Net 2.0 中MemberShip和Role的分布存储问题        
</membership>
ASP.Net 2.0 中MemberShip和Role的分布存储问题        
<!-- Membership end-->

同时在<connectionStrings>节点中配置 数据库连接字符串

ASP.Net 2.0 中MemberShip和Role的分布存储问题<add name="MySqlConnection" connectionString="Data Source=localhost;Initial Catalog=aspnetdb;Persist Security Info=True;User ID=sa;Password=123"/>

在使用Membership.CreateUser时,表aspnet_Applications按照配置membership节点中的applicationName生成一笔记录,同时aspnet_Users和aspnet_Membership各生成一笔记录。在使用Roles.AddUserToRole()时,笔者故意将username写错,结果插入成功,aspnet_User生成一笔记录,aspnet_UsersInRoles也有记录,也就是说,当使用Roles.AddUserToRole()时,不管User是否在Membership中,都会成功加入到Roles中,不会是微软提供的逻辑搞错了?
      注意到Membership和Roles数据在一个DB中,能否分开?测试结果是可以的。使用aspnet_regsql -E -S testServer -A r在testServer上建立Roles相关表及库。增加数据库连接节点<add name="RoleSqlConnection" ....>同时把RoleManager中的connectionStringName改为RoleSqlConnection.调用Roles.AddUserToRole(),aspnet_User表中同样生成记录而不检查aspnet_Membership.
      个人觉得这样处理有利也有弊,分开存储在企业大型应用中可能会用得到,提高效率,但是一般小型系统中,如果程序员在写权限管理,调用AddUserToRole(),忘了做检查,就容易造成数据混乱。

相关文章: