初步掌握ASP.NET 2.0 Login控制項 - 角色管理
作者:Ray
時間: 2007年4月2 日
http://www.cnblogs.com/Rayinuk/archive/2007/04/02/696711.html
總結一下角色管理方面的東西。
先給出MSDN有關Role Manager的文章,大家可以去看看:
http://msdn2.microsoft.com/en-us/library/ms998314.aspx
在最初的時候,我並沒有想著去使用VS的角色管理,而是想自己建立一套自己的角色管理機制,這樣可能會更靈活一些,但在後期,我還是改變了,處於學習的理由,我還是認為自己建立一套角色管理機制和許可權機制會更加靈活。。
類似於Profile, 我們仍需要在web.config啟動Role Manager。這裡插一句,其實我們可以在IIS中配置ASP.NET的屬性,包括我們一起所做的修改均可以介面化實現,其配製按預設儲存在WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\web.config ,大家可以先行設定,然後去該檔案察看。
在Web.config中配置如下:
<roleManager enabled="true" defaultProvider="SqlRoleManager">
<providers>
<add name="SqlRoleManager"
type="System.Web.Security.SqlRoleProvider"
connectionStringName="LocalSQLServer"
applicationName="FBHelper" />
</providers>
</roleManager>
這裡要提到的是裡面的connectionStringName可設定為你當前web.config裡已定義的連接字串,不需要重建立立,applicationName則是你當前系統的名稱(解決方案名稱)。
Ok, 我們啟用了Role Manager後,可在前台進行相關的操作。但在此前,我們需要先定義角色。定義一個角色可以採取以下方法:
1) 利用Role Provider在前台代碼實現。如下:
using System.Web.Security;
if (!Roles.RoleExists("TestRole"))
{
Roles.CreateRole("TestRole");
}
2) 在資料庫利用預存程序實現。利用aspnet_roles_createrole實現,如下:
EXEC aspnet_Roles_CreateRole 'ThisApplication', 'NewRole'
EXEC aspnet_UsersInRoles_AddUsersToRoles 'ThisApplication', 'ThisUser', 'NewRole', 8
所建立的Role將會儲存在aspnet_roles中,和aspnet_applications及aspnet_users中,這個稍後再提。
建立完角色後,我們可以在前台直接將使用者指派給一個角色。 比如我們現在需要在註冊完一個新使用者後,直接給使用者指派一個角色。正如上篇文章所講的,在添加使用者的地方(CreateUserWizard1_CreatedUser事件中),我們可以添加以下代碼來實現:
// 添加使用者實現代碼
//添加使用者至角色中
Roles.AddUserToRole(CreateUserWizard1.UserName, "Dept1");
上面的代碼中,我是Hard Code了 “Dept1 ”這個角色,這個應該是Role的名稱,主要根據自己項目中的設計來定了。
OK,現在我們可以檢查一下資料庫裡發生的情況。角色 的資料主要體現在3個表中,分別是:
Aspnet_application
Aspnet_users
Aspnet_Roles
我第一次查看的時候,aspnet_roles儲存的自然是我們所建立的Role的資訊,但是Role與使用者的關係體現在那裡呢?後來我看到了aspnet_user表中多出了一個相同使用者,但applicationID 和 UserID不同的資料,依此又查出在aspnet_application表中添加了一個新的application記錄,我才明白,對於一個角色和使用者的關係,系統將之定義為一個新的application,即看成一個新的機制,儲存於上述的表中,因此在aspnet_users表中雖然有兩條相同使用者資料的記錄,但是卻處於不同的application.
這是我目前對該機制的一個看法,不知道是不是正確的,還請知道的朋友確認一下。
也因此,在我們想要從aspnet_users表中擷取使用者資料的時候,需要加入相應的條件來進行篩選。但只是擷取自己系統使用者的時候使用,因為對於Role系統,前台我們可以利用.NET的Roles Manager來處理。當然前台的Membership Manager在進行使用者操作的時候,操作對象也是自動的指向了系統的使用者,而不是角色系統中的使用者。例如:刪除一個使用者時,表中的Role關係的使用者依然存在。出於這種情況,看來需要手工代碼來實現刪除使用者的同時,刪除角色與使用者的關係,以免資料庫出現垃圾資料。
最後一步就是看如何在前台利用Role Managers進行角色資訊的調用了。
這個很簡單,看看協助就都出來了,這裡就舉個例子,一看就明白了:
在Login控制項中設定好Destination,例如Default.aspx, 我們需要根據當前角色的不同,跳轉到不同的介面,那麼我們在Default.aspx的Page_Load中加入以下代碼可以實現:
protected void Page_Load(object sender, EventArgs e)
{
lblMsgRole.Text = "您的角色是 " + Roles.GetRolesForUser(Profile.UserName)[0];
Response.Write(@"<script language='javascript'>alert('注意:10秒鐘後 頁面將自動跳轉到您的部門頁面!');</script>");
if (Roles.GetRolesForUser(Profile.UserName)[0].Equals("Dept1"))
{
Response.Write(@"<script language='javascript'>setTimeout('',10000);</script>");
Response.Write("<meta http-equiv='refresh' content='10;URL=./dept1.aspx'>");//
}
else
{
Response.Write(@"<script language='javascript'>setTimeout('',10000);</script>");
Response.Write("<meta http-equiv='refresh' content='10;URL=./dept2.aspx'>");//
}
}
可以看到,我們可以利用Roles.GetRolesForUser(Profile.UserName)[0];來擷取當前登入使用者的角色資訊,在根據角色的內容來做相關的處理。 當然,這隻是Roles Manager中的其中一個簡單的應用,還有很多功能可以再從MSDN中擷取學習。
通過這兩章的內容,應該可以基本上將Login控制項應用於自己的系統,並將.NET預定義的資料庫和自己的資料庫連接起來,以縮短開發時間。其實我感覺一個Login控制項更像是一個學習控制項,一個體現Membership, Roles, Users應用的非常好的控制項,當然它也可以很好的應用與系統,但是個人總感覺在該控制項還不夠靈活,對於一些大中型項目還是自己建立要更好些。
呵呵,Login控制項還真是“想說愛你不容易啊”!