ASP.NET, MVC 3, EF 4.1: фильтрация данных на основе аутентификации ASP.NET - PullRequest
2 голосов
/ 20 мая 2011

Если у вас есть приличное многоуровневое веб-приложение ASP.NET MVC 3 с классом обслуживания данных, откачивающим модели представлений, извлеченные из репозитория, отправляя JSON клиенту Ajax,

[вздыхая]

Каков хороший способ добавить фильтрацию данных на основе имен и ролей ASP.NET, не мешая нашему классу обслуживания данных этими проблемами?

У нас есть репозиторий, который выводит POCO Entity Framework 4.1, который принимает лямбда-выражения для предложений where (или объектов спецификации.)

Класс обслуживания данных создает объекты запросов (например, IQueryable), а затем возвращает их с помощью .ToList () в операторе return.

Я думаю, может быть, спецификация, которая обрабатывает роли безопасности, передаваемые в класс обслуживания данных, или как-то по существу вводит лямбда-выражение в правильном месте в классе обслуживания данных?

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

Ответы [ 2 ]

1 голос
/ 20 мая 2011

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

Вы можете использовать пользовательский принципал для хранения дополнительных данных о пользователе (следите за этим: http://www.asp.net/security/videos/use-custom-principal-objects),, но хитрость заключается в том, чтобы установить этот пользовательский субъект в субъект текущего потока, выполнив Thread.CurrentPrincipal = myPrincipal

Это фактически означает, что вы можете получить доступ к своей информации о пользователе / ​​роли изнутри вашего уровня обслуживания без создания дополнительных параметров в ваших методах (что является плохим дизайном). Вы можете сделать это, запросив Thread.CurrentPrincipal и приведя его к собственной реализации.

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

Редактировать: чтобы вернуться к вашим запросам данных, очевидно, что любые запросы, которые вы пишете, на которые влияют некоторые аспекты текущего пользователя, вошедшего в систему, или их роль, могут быть обнаружены при просмотре данных в вашем пользовательском субъекте, но без передачи специальных данных через вызовы методов.

Надеюсь, это, по крайней мере, укажет вам правильное направление.

0 голосов
/ 28 июня 2011

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

Создайте интерфейс с именем IUserSession или что-то подобное. Реализуйте, что внутри вашего приложения asp.net mvc интерфейс может содержать что-то вроде GetUser ();Исходя из этой информации, я уверен, что вы можете фильтровать данные внутри вашего среднего уровня, в противном случае вы можете просто использовать эту IUserSession внутри вашего веб-приложения и выполнять фильтрацию внутри этого уровня ...

См .: https://gist.github.com/1042173

...