因為之前安裝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(),忘了做檢查,就容易造成資料混亂。