ASP.net 2.0出來以後,一直想用一下2.0的Membership,這個封裝的很好的網站權限管理工具。我採用的是SQLProvider,用aspnet_regsql產生了所需要的表,並且配置了web.config,但是在實際使用中卻遇到了不少的問題,包括登錄以後通過Membership.GetUser()來獲取當前登錄的用戶,結果代碼返回給我的是null.....包括在webconfig中的認證和授權的設置,似乎也全然不起效果,經過一番搜索,還是無法解決這個問題,於是沒辦法,只能利用membership,但是卻自己實現整個認證授權的過程。
因為login控制項不起作用,所以就自己寫了一個login.aspx的頁面,這個頁面透過Membership.ValidateUser()函數對使用者的登入進行判斷,使用者成功登入以後,將使用者的username儲存到session中。
自己實作了一個XML序列化的可配置的對象,大致如一下的結構
PageLocations是一個PageLocation的List物件集合,Pagelocation中location包含了所要加入權限的頁面。 Pagelocation中的包含一個Allow對象,其中有一個屬性是Roles,包含頁面可授權的使用者角色,可以用逗號分割,這樣把所有的頁面加入到這個XML結構中。
然後實作如下的一個函數:
///
/// 是否允許存取該頁
///
/// 授權的路徑
/// 授權角色
///
public bool isAllow(Uri url,string[] rolenames,HttpContext context)
{
string path=context.Server.MapPath(url.AbsolutePath);
PageLocation theLocation = null;
foreach (PageLocation location in pageLocations)
{
string strlocation;
strlocation=context.Server.MapPath(location.Location);
if (strlocation.ToLower() == path.ToLower())
{
theLocation = location;
}
}
if (theLocation != null)
{
string[] roles = theLocation.Allow.Roles.Split(',');
foreach (string role in roles)
{
foreach (string rolename in rolenames)
{
if (rolename == role)
{
return true;
}
}
}
return false;
}
else
{
return false;
}
}
透過對目前存取頁面的絕得路徑和xml中的絕得路徑進行比較,然後取得xml中描述的Pagelocation對象,從而判斷他Allow的Role是不是和當前的用戶的Role是不是匹配,從而來實現角色的安全授權。
由於我這個管理是用在一個後台的安全管理上面,所以寫了一個用戶控制項來封裝這個SecurityConfig 類,透過Context.Session[]來取得登入的用戶帳號,然後透過Roles.GetRolesForUser(username)來取得登錄使用者的角色,然後將Context.Request.Url和roles一起傳入到剛才的函數中,如果使用者獲得授權就展示當前頁面,不然就跳到自己得登入頁面或提示你無此權限。
由於我使用了MasterPage,所以對於這種情況我只要把這個控件綁定到masterpage上,這樣每個頁面就都在管理中了,並且在後台寫一個對這個SecurityConfig 對象得編輯和序列化得頁面,就實現了對所有頁面得權限控制。
對於採用這種方式,也是在玩不靈Membership時候得一個下策,這樣即利用了Membership提供得關於用戶得如CreateUser,CreateRoles這些基本功能,又滿足了對權限設置得需要,現在也只能這麼處理了。
第一次在首頁投稿,另外希望哪位朋友能告訴我什麼情況下.net得授權會不靈。
http://www.cnblogs.com/livesite/archive/2006/08/14/membership.html