2014 相信自己能做的更好

---------------------------------------------------------------------------------------------------------
Everything is possible    Nothing is Impossible     
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

ASP.Net 2.0 中MemberShip和Role的分布存储问题

Posted on 2006-11-23 16:53  Arping.Net探索  阅读(2449)  评论(1编辑  收藏  举报

         因为之前安装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了,如下

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

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

<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(),忘了做检查,就容易造成数据混乱。