我有很多不同的權限和不同的角色類似於下面的[我沒有代碼在這裏,所以我會只是試圖在這裏重建吧]的巨大的應用做了一個名爲SecuredPage的類如下所示:
public class SecuredPage : System.Web.UI.Page
{
// Those Permissions are mandatory, so user needs to have all of them
public List MandatoryPermissions { get; set; }
// Those Permissions are optional, so if the user have at least one of them, he can access
public List OptionalPermissions { get; set; }
protected override void OnLoad(EventArgs e)
{
MyUser loggedUser = (MyUser) this.User;
base.OnLoad(e);
foreach (Permission mandatoryPermission in MandatoryPermissions)
{
// if the user don't have permission, we can redirect him
if (!loggedUser.HasPermission(mandatoryPermission))
{
RedirectToDontHaveAccess();
break;
}
}
bool hasAccessToThePage = false;
foreach (Permission optionalPermission in OptionalPermissions)
{
// If the user has at least one of the permissions, he can access
if (loggedUser.HasPermission(optionalPermission))
{
hasAccessToThePage = true;
}
}
if (!hasAccessToThePage)
{
RedirectToDontHaveAccess();
}
}
private void RedirectToDontHaveAccess()
{
throw new NotImplementedException();
}
}
這將是我的BasePage,用於需要用戶訪問權限的所有頁面。 MandatoryPermissions
是用戶必須讓他們全部訪問該頁面的權限,而用戶至少需要其中一個用戶訪問該頁面的權限是OptionalPermissions
。 因爲如果您有MandatoryPermissions
沒有必要在每個頁面上都使用,因爲如果您有選擇權或不。
權限是枚舉:
public enum Permission
{
// Usually this enum will replicate a domain table from the database
EditUser = 1,
SearchUserByUsername = 2,
SearchUserByEmail = 3
}
而且MyUser
是MembershipUser
一個實現:
public class MyUser : System.Web.Security.MembershipUser
{
internal bool HasPermission(Permission permission)
{
//
// TODO: Check on database if the user has the permission or not
//
}
}
然後,你需要在你的網頁做的唯一的事情是填充的權限列表:
public partial class EditUser : SecuredPage
{
protected void Page_Load(object sender, EventArgs e)
{
MandatoryPermissions.Add(Permission.EditUser);
}
}
public partial class SearchUser : SecuredPage
{
protected void Page_Load(object sender, EventArgs e)
{
OptionalPermissions.Add(Permission.SearchUserByUsername);
OptionalPermissions.Add(Permission.SearchUserByEmail);
}
}
好的,搜索範例不是很好,但我認爲你可以得到圖片。
整個想法是在權限驗證之前調用base.OnLoad(e);
,因此您只需填寫Page_Load
中的權限即可。
我不知道這是否是最好的解決辦法,但我敢肯定,它幫助了很多:)
我們在我們的應用程序中使用相同的方法,我們只是使用自定義角色提供者和成員資格提供程序進行身份驗證和角色加載。 我真正想知道的是,您是否在User_IsInRole(「Admin」)中對每個管理頁面的page_init中的第一件事進行了硬編碼。或者你有其他解耦方式嗎?我不想將角色或azman規則名稱硬編碼到我們的頁面中。 – JohannesH 2009-04-24 22:41:27
我使用web.config授權和主模板的組合來將我的實際代碼檢查降到最低。我還有一些輔助功能,如「IsAdminAuthorized」和「IsManagerAuthorized」,當幾個不同角色的用戶有資格擔任管理員或經理時,可以進行組合檢查。 – 2009-04-25 00:04:56