Я работаю над новым приложением ASP.Net с зелеными полями. Мы реализуем базовую страницу, на которой будут основаны все страницы. Приложение будет работать под интегрированной аутентификацией Windows, поэтому у меня будут данные учетной записи пользователя. С их помощью я пойду к нескольким базам данных (в которых будет существовать пользователь), чтобы выяснить, какие роли им назначены в каждой БД. Я буду удерживать роль yay / nay в массиве bool и вводить ее с помощью перечисления.
Будет объект сеанса, который будет содержать несколько вещей и роли, назначенные для этого пользователя. Я подумываю сделать объект сеанса доступным как свойство базовой страницы, так как код будет выглядеть примерно так:
public SessionObject MasterSessionObject
{
get
{
if (Session["SessionObject"] == null)
{
// Create session object, assign user name, etc.
// Do something with roles...
Session["SessionObject"] = sessionObject;
}
return (SessionObject)Session["SessionObject"]
}
}
Чтобы контролировать, что происходит на (подклассифицированной) странице, я хочу предоставить метод CheckSecurity - например, если пользователь не авторизован для определенной части страницы, он может быть скрыт / отключен, или он может быть загружен обратно на «не вашу» страницу. Логическим местом для этого является базовая страница, но, учитывая, что базовая страница уже предоставляет объект SessionObject, который содержит разрешения для ролей, не имеет ли больше смысла для создания объекта типа DatabaseSecurity и проверки этого?
Имея дело с последним подходом, я до сих пор использовал абстрактные базовые классы: у меня есть абстрактный класс DatabaseRoles, который содержит массив bool, и метод для получения ролей для пользователя. Конкретная реализация содержит Enum (как упоминалось ранее) для ввода в массив (в базовом классе). Абстрактный класс также имеет метод CheckRole, который принимает int, к которому я собираюсь использовать приведение перечисления ...
SessionObject содержит несколько из этих реализаций DatabaseRoles и, по сути, устраняет необходимость в CheckSecurity в классе базовой страницы, что приводит к коду, подобному следующему на реальной странице:
if (MasterSessionObject.SampleDatabaseRoles.Check((int)SampleDatabaseRolesEnum.RoleView))
{
// Do something
}
Но, я уверен, вы согласитесь, это выглядит отстойно ...
Если бы на базовой странице был метод CheckSecurity, он должен был бы взять конкретный объект DatabaseRoles, а также перечисление роли для проверки, что также выглядело бы отстойно. И, наконец, позднее будет необходимо добавить больше баз данных и их параметры безопасности ...
Я добавлю код завтра, если потребуется ...: -s
Я не знаю, я не такой толстый, но мне иногда трудно связать все это вместе ...
Спасибо,
Майк К.