Прозрачная надежность авторизации - PullRequest
3 голосов
/ 01 сентября 2011

Мне нужен механизм для пользовательской авторизации в классах бизнес-логики. Это должна быть система, основанная на разрешениях, но я не могу решить, как применять правила авторизации к методам.

Моей первой мыслью было применение пользовательских атрибутов к методу

[NeedPermission("Users", PermissionLevel.Read)]
public IList<User> GetAllUsers()
{
     // some code goes here
}

Мой класс бизнес-логики имеет интерфейс, поэтому я могу использовать, например, поведение Unity Interception и проверять во время выполнения, есть ли у текущего пользователя необходимые разрешения. И бросить исключение, если он не имеет.

Но теперь меня беспокоит надежность этого метода.

Обычно ссылка на класс бизнес-логики, введенная контейнером единицы. Так что проблем нет, потому что он настроен на применение механизма перехвата интерфейса.

Но что, если какой-нибудь разработчик создаст экземпляр моего класса бизнес-логики напрямую? Тогда перехват не будет применен, и он сможет вызывать любой метод, даже если у текущего пользователя нет прав на выполнение каких-либо действий или даже он не аутентифицирован.

Также кто-то может изменить конфигурацию контейнера для единства, полностью отключить расширение перехвата. Опять моя система авторизации не будет работать.


Я видел, что ASP .NET MVC использует похожий механизм авторизации. Правило авторизации применяется только тогда, когда запрос поступил стандартным способом (IController.Execute). Я думаю, что это не проблема в этом случае, потому что конечный пользователь контроллера (веб-пользователь) не имеет никакого доступа к классу контроллера напрямую.

В моем случае конечный пользователь бизнес-логики - это программист, который разрабатывает интерфейс и может преднамеренно или непреднамеренно вмешиваться - создавать экземпляр класса бизнес-логики и вызывать любые методы.

Что вы можете мне предложить? Как вы справляетесь с такого рода проблемами?

Спасибо.

Ответы [ 2 ]

1 голос
/ 01 сентября 2011

Если ваши конструкторы являются внутренними, а ваши объекты созданы на фабрике, разработчик не сможет обойти вашу безопасность по ошибке.

Если кто-то действительно, действительно хочет создать ваши объекты без защиты, он все равно может сделать это с помощью отражения, но это было бы довольно намеренно.

1 голос
/ 01 сентября 2011

.NET Framework поддерживает механизм декларативной проверки разрешений, который не зависит от перехвата Unity или других «внешних» AOP.Чтобы воспользоваться этим, ваш атрибут должен наследоваться от System.Security.Permissions.CodeAccessSecurityAttribute . System.Security.Permissions.PrincipalPermissionAttribute , включенный в BCL, является примером использования этого механизма для оценки пользовательских разрешений.Если это не соответствует вашим потребностям, ничто не помешает вам создать свой собственный атрибут, который подходит.

...