Я сделал это в огромном приложении, имеющем множество разных разрешений и разных ролей, что-то вроде следующего [У меня нет кода здесь, поэтому я просто попробую воссоздать его здесь]:
Сначала я реализовал класс с именем 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();
}
}
Это будет моя базовая страница для всех страниц, для которых пользователю необходимы разрешения.
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
.
Я не уверен, что это лучшее решение, но я уверен, что оно очень помогает:)