я в огромном заявке, имеющей множество различных разрешений и различных ролей нечто вроде следующего [У меня нет кода здесь, так что я просто пытаюсь воссоздать его здесь]:
я впервые реализовал класс под названием 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
.
Я не уверен, если это лучшее решение, но я уверен, что это очень помогает :)
Я реализовал MembershipProvider и RoleProvider. Мои вопросы - это то, как вы отделяете авторизацию от отдельных страниц. Я имею в виду, вы помещаете Roles.IsInRole («admin») на каждую из ваших страниц? Вы используете элементы местоположения web.config? Или у вас есть другой способ развязать его со страниц? – JohannesH
Ах, хорошо, поэтому я отредактирую свой ответ, чтобы показать, как я обычно это делаю :) Всего секунду – homemdelata
Да, подход типа «базовая страница» - это то, что мы делаем, - создайте базовую страницу, которая обрабатывает всю аутентификацию/доступ управление и т. д., а также несколько других функций, а затем наследовать отдельные страницы. –