Поработав над этой проблемой некоторое время, я пришел к следующему выводу:
Реализация безопасности, такой как Authentication
, Role-based security
, Authorization
и т. Д. В User-Уровень Layer не является хорошей идеей в основном по двум причинам:
- Если вы хотите создать другие интерфейсы для своего приложения, скажем,
WinForms
или Silverlight
, то выМне придется снова и снова внедрять эту защиту с нуля. - Вы всегда можете использовать другие компоненты / слои вашей системы, не создавая приложение пользовательского интерфейса.Предположим, вы создали простое консольное приложение, которое ссылается на другие слои в вашей системе (например,
Repositories
).тогда вы можете создать экземпляр хранилища и манипулировать данными.в этом случае вы успешно переопределили любую защиту.
Таким образом, решение состоит в том, чтобы внедрить этот тип защиты в другом уровне, который встроен в саму модель домена и не привязан к пользовательскому интерфейсу.layer (UI).
Теперь есть некоторые варианты того, как вы можете это сделать.скажем, у нас есть слой с именем AppService
, который является точкой входа во всю систему.этот слой состоит из сообщений (шаблон обмена сообщениями, например, шаблон Request-Response
), ViewModels
, которые являются плоскими представлениями объектов домена, и Methods for retrieving and manipulating data
и т. д. Здесь мы можем реализовать такие меры безопасности с помощью объектов PrincipalPermission
.мы можем применять правила безопасности к классам и методам.Вот простой пример:
[PrincipalPermission(SecurityAction.Demand, Authenticated=true)]
public void DoSomething()
{ }
С атрибутом, определенным для этого метода, код требует аутентификации вызывающей стороны.Модель аутентификации может быть любой, включая Windows Authentication
, Forms Authentication
и так далее.теперь это работает нормально, потому что теперь мы слабо связали пользовательский интерфейс с правилами безопасности, определенными на уровне сервиса.однако есть еще одна загвоздка.
Этот проект будет работать нормально, поскольку сервисный уровень действительно является главной точкой входа в систему .Это означает, что если вы все еще можете создать экземпляр, скажем, хранилище, без необходимости получения экземпляра вашего AppService, вы все равно можете переопределить правила безопасности.Это означает, что либо вы должны разработать свою модель домена таким образом, что для работы с компонентами / уровнями вашей системы потребуется экземпляр AppService.
В этом случае любая функция, предоставляемая в системе, являетсядоступно только через сервисный уровень приложения.с другой стороны, если это невозможно или не имеет значения в данный момент, вам придется определять свои правила безопасности и на других уровнях.Это означает, что вам придется определять правила безопасности и в ваших репозиториях.так что, если кто-то создает экземпляр хранилища и пытается манипулировать данными, не выполняя свои команды через слой UI
или AppService
, вы все равно применяете меры безопасности.
Другое дело, что с использованием правил PrincipalPermission
на ваших классах и методах не привязан к конкретной модели аутентификации / авторизации.так что вы можете использовать такие правила безопасности в веб-приложениях с Forms Authentication
или в приложениях Windows с Windows/AcctiveDirectory Authentication
и т. д.
Как вы помните, я разрабатываю простой движок для блогов на ASP.NET
и эту модельработает нормально на данный момент.Если есть более подробные подробные сведения о плюсах и минусах, или примеры и сообщения в блогах, которые могут помочь в этой теме, пожалуйста, обязательно оставьте свои комментарии и ответы [: