程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> .net的Membership,為什麼就這麼困難呢?

.net的Membership,為什麼就這麼困難呢?

編輯:.NET實例教程


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序列化的可配置的對象,大致如一下的結構

<?XML version="1.0"?>
<SecurityConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<PageLocations>
<PageLocation Location="~/admin/admin/RoleManager.ASPx">
<Allow Roles="Administrator" />
</PageLocation>
</PageLocations>
</SecurityConfig>

PageLocations是一個PageLocation的List對象集合,Pagelocation中location包含了所要加入權限的頁面。Pagelocation中的包含一個Allow對象,其中有一個屬性是Roles,包含頁面可授權的用戶角色,可以用逗號分割,這樣把所有的頁面加入到這個XML結構中。

然後實現如下的一個函數:

/// <summary>
/// 是否允許訪問該頁
/// </summary>
/// <param name="url">授權的路徑</param>
/// <param name="rolenames">授權角色</param>
/// <returns>是否獲得授權</returns>
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


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved