因为之前安装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 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>节点中配置 数据库连接字符串
在使用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(),忘了做检查,就容易造成数据混乱。