Я согласен с вами, что ваш нынешний дизайн ужасен.Что мне лично не нравится в этом подходе, так это то, что вы настраиваете конфигурацию безопасности на странице.У вас будет ошибка безопасности, когда кто-нибудь забудет об этом и как вы проверяете правильность конфигурации этой страницы?
Вот две идеи: Во-первых: используйте фабрику, способную разрешить правильную реализацию этой службы на основедля пользовательских ролей:
public static class MyServiceFactory
{
public static IMyService GetServiceForCurrentUser()
{
var highestRoleForUser = GetHighestRoleForUser();
Container.Resolve<IMyService>(highestRoleForUser);
}
private static string GetHighestRoleForUser()
{
var roles = Roles.GetRolesForUser().ToList();
roles.Sort();
return roles.Last();
}
}
Во-вторых: есть несколько методов на этом интерфейсе, один для обычных пользователей, один для администраторов.Реализация этого интерфейса может иметь PrincipalPermissionAttribute
, определенный для ограниченных методов:
class MyServiceImpl : IMyService
{
public List<Foo> All()
{
// TODO
}
[PrincipalPermission(SecurityAction.Demand, Role ="Administrator")]
public List<Foo> AllAdmin()
{
// TODO
}
}
Надеюсь, это поможет.