Intereting Posts
Гладкое масштабирование и панорамирование на Windows Phone 8 Какова наилучшая практика в случае, если один аргумент равен нулю? Как использовать SetupCopyOEMInf во время установки Как получить все адресное пространство памяти, используемое процессом? Неоднозначные имена controllerов с атрибутами маршрутизации: controllerы с таким же именем и другим пространством имен для управления версиями Как я могу сериализовать все свойства объекта с отображением NHibernate? Связка WPF DataGrid SelectedItem перестает работать после изменения позиции Как связать команды приложения для просмотра модели (WPF)? Сколько усилий требуется для преобразования ASMX в веб-службу WCF? Должен создать DependencySource в той же теме, что и DependencyObject Различные настройки конфигурации для разработчика для библиотеки classов c # Как определить, сколько памяти я могу выделить для массива в C # Как правильно установить таймаут при объединении с ADFS 2.0 Почему Attributes.IsDefined () отсутствуют перегрузки? Как получить NameTable из XDocument?

.net C #, какова наилучшая практика для обеспечения безопасности каждого метода?

У меня есть веб-проект с бизнес-уровнем, который обрабатывает некоторые операции с данными. Я хотел бы защитить некоторые или все методы, проверив, есть ли активный незавершенный действительный Session перед выполнением метода.

Сначала я подумал, используя Attribute над classом, но я не смог запустить его правильно. Поскольку class является обычным classом и не является производным от System.Web.Page . class атрибута никогда не запускается при вызове требуемого экземпляра BL. Кроме того, некоторые из методов могут не требовать действительного сеанса, поэтому всему classу может не понадобиться полная безопасность. А также добавление строки, которая проверяет сеанс в каждом начале метода, не кажется очень многообещающим.

Если вы спросите меня, почему мне нужно защищать по методу, я мог бы объяснить следующее:

  • Это веб-проект
  • Человек может начать с заполнения, но в тот момент он не спас его
  • Этот экран ждет около 30 минут, скажем,
  • Сессия уже завершена
  • Пользователь вернулся к компьютеру и нажимает кнопку SAVE , но процесс НЕ должен быть завершен

Операция сохранения может быть легко выполнена DELETE или SELECT .

Поскольку существует много типов форм и т. Д., У меня есть BL.ItemManager , BL.VideoManager , BL.ServiceManager и т. Д. Итак, в этих classах есть много вариантов сохранения, удаления и выбора.

Поэтому существует ли опрятный способ защитить некоторые методы, проверив сеанс перед запуском процесса

Вы можете использовать аспектно-ориентированный подход; PostSharp может быть вариантом.

Все, что вам нужно сделать, это создать атрибут, используя PostSharp для ввода кода перед вызовом метода, чтобы проверить, жив ли сеанс. Что-то вроде;

 [SessionAlive] public void SomeMethod() 

Или вы можете просто использовать метод Session_End в файле Global.asax, или вы можете просто использовать код javascript, чтобы перенаправить страницу входа в систему .

АОП – отличная техника для вашего требования. Вы можете использовать PostSharp и DynamicProxy от Castle. Эти frameworks позволяют перехватывать вызовы методов, и вы можете выполнить проверку безопасности в перехватчиках.

Самое большое техническое различие между PostSharp и Castle DynamicProxy – PostSharp изменяет ваш IL-код, где Castle DynamicProxy создает производный тип вашего classа и дает вам экземпляр нового, полученного во время выполнения. Это означает, что при декомпиляции кода, использующего PostSharp, вы видите некоторые другие коды, которые не написаны в оригинальном коде C Sharp.

Если вы выбираете подход DynamicProxy, вы должны создавать экземпляры своих classов через фабрику, но если вы предпочитаете PostSharp, вы можете напрямую использовать свои classы. Все, что вам нужно, это добавить некоторые атрибуты. С другой стороны PostSharp не является бесплатным.

Наконец, вы можете реализовать DynamicProxy самостоятельно. Вот простой генератор DynamicProxy, который я написал. Вы можете обрабатывать вызов до / после вызова и событий ошибки. Это всего лишь образец кода, и если вы планируете использовать его в важном приложении, вам следует предпочесть замок.

Еще одна возможность – использовать функцию Castle Dynamic proxy – оберните свою службу. Динамический прокси позволяет перехватывать вызовы методов и обертывать их каким-то общим поведением – вы можете перехватить только те конкретные методы, которые вы хотите, и добавить проверку сеанса.

Динамический прокси-сервер свободен в отличие от postsharp.

AOP определенно способ пойти на это. В дополнение к инфраструктурам AOP общего назначения, уже предложенным в других ответах, вам может быть интересно узнать, что среда .NET включает механизм AOP для проверок безопасности этого типа. Чтобы использовать его, просто создайте (и используйте) атрибут, который наследуется от CodeAccessSecurityAttribute , вместе с реализацией IPermission, который он может использовать для проверки действительности сеанса.