ASp.NET MVC EF4 SQL таблица или безопасность на уровне поля - PullRequest
2 голосов
/ 04 февраля 2011

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

Сценарий: интранет-система. Данные о ряде связанных объектов должны рассматриваться как частные. Это известно как неопубликованная часть системы. Только определенные пользователи могут получить доступ к этим данным. На каком-то этапе пользователи делают выбор из этих данных, отмечают некоторые записи и публикуют их на «опубликованной» стороне. Данные, опубликованные на опубликованной стороне, удаляются с неопубликованной стороны. Основная часть пользователей систем может затем работать с записями на опубликованной стороне.

Я знаю, что это звучит как поле bool в родительской записи, помеченное как опубликованное или неопубликованное, но позвольте мне объяснить, как система, которую мы заменяем, решает проблему - это уровень безопасности, который мы должны эмулировать. Это база данных плоских файлов (Dataflex) с неопубликованными и опубликованными данными в отдельных таблицах, на отдельных серверных дисках, резервное копирование на отдельные ленты, в разных комнатах, с физическим доступом разных людей. Сетевые права гарантируют, что опубликованные пользователи не смогут получить неопубликованные данные. Программное обеспечение также управляет правами, но если что-то пойдет не так или программист совершит ошибку, они все равно не смогут получить доступ к неправильным данным. Системные администраторы, которые потенциально могут получить доступ к этим данным, имеют положительную проверку безопасности.

Итак, я ищу совет о том, как создать архитектуру с MVC, EF4, SQL, которая этого добивается. В одном крайнем случае я строю две системы с двумя базами данных sql с разными правами: возможно, с учетом различий, содержащихся в web.config, поэтому фактически это одна и та же кодовая база. На другом конце шкалы его флаг в таблице с методами контроллера, размеченными для запрета доступа. (Это бесполезно, потому что, если программист напутает, скажем, поисковый запрос, и он возвращает данные из неправильной категории, и это делает его незамеченным из здания, это может привести к человеческим жертвам, собакам и кошкам, живущим вместе ... масса истерия)

Извините за длинное описание. Лучшие практики или другие советы о том, как получить доступ к этому запросу.

Ответы [ 3 ]

2 голосов
/ 05 февраля 2011

Не для MVC / EF-ответа, но есть более старая статья Technet (для SQL Server 2005), которая отвечает на многие вопросы и может быть полезна:

"Реализация защиты на уровне строк и ячеекв секретных базах данных с использованием SQL Server 2005 "

Доступно в Technet .Эту же бумагу можно также загрузить как документ Word .

1 голос
/ 26 июня 2013

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

public static bool ActionIsAuthorized<T>(this T entity, ActionType actionType, string     actionBy) where T : BaseEntity
{
   bool authorized = false;
    //do your auth lookup here based on which kind of action they are performing. ActionTypes     is an enum
    return authorized;
}

А потом просто назовите это так:

if(!YourEntity.ActionIsAuthorized(ActionType.Update, username))
{
    throw new ActionUnauthorizedException();
}
else
{
    //do data access stuff here
}
1 голос
/ 04 февраля 2011

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

Nhibernate против EntityFramework в реальном мире

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

Предположительно, вы развертываете веб-сервер и сервер приложений и соединяете их с помощью wcf, поэтому вопрос должен быть не в том, что собирается делать MVC, а в том, как MVC, WCF и ORM, если таковые имеются, на ваш выбор. собираюсь взаимодействовать.

Другой способ, возможно, использовать в SQL Server обновляемые представления, маскирующие неопубликованные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...