Написание пользовательских атрибутов в C # подобно атрибуту ASP.Net MVC Authorize. - PullRequest
5 голосов
/ 29 июля 2009

Мне нравится атрибут ASP.Net MVC Authorize, я могу расширить его, построить собственную логику и украсить свой контроллер им. НО,

В моей архитектуре у меня есть один общий сервисный уровень (библиотека классов C #). Конечный пользователь может получить доступ к моему приложению через веб-сайт ASP.Net MVC или через мой открытый уровень веб-сервиса REST WCF. Мое приложение asp.net MVC и сервисный уровень REST WCF по очереди обращаются к моему общему сервисному уровню.

Я хочу, чтобы авторизация происходила на этом общем сервисном уровне, а не в ASP.Net MVC Controller или на моем открытом сервисном REST-уровне.

Могу ли я создать ASP.Net MVC Authorize как атрибут для украшения моих методов в общей библиотеке классов C #? Этот атрибут будет принимать параметры и будет определять, есть ли у текущего пользователя доступ к этой функции или нет?

Спасибо и С уважением, Аджай

Ответы [ 4 ]

5 голосов
/ 29 июля 2009

То, что вы ищете, может быть достигнуто с помощью библиотеки AOP, например, PostSharp (http://www.postsharp.org/). Это более сложно, чем использование атрибута Authorize в mvc, но все еще довольно просто.

2 голосов
/ 29 июля 2009

Еще один способ справиться с этим - использовать атрибут [PrincipalPermission] на вашем сервисном уровне. Это может помешать вызывающим программам выполнить метод (или получить доступ ко всему классу) без определенной авторизации.

1 голос
/ 29 июля 2009

Нет, AuthorizeAttribute работает, потому что инфраструктура MVC явно вызывает его перед вызовом метода. Подобная функция для вашего сервисного уровня будет работать только в том случае, если ваши клиенты также явно ее вызовут. Было бы неразумно предполагать, что даже клиент с благими намерениями всегда будет не забывать искать атрибут и вызывать его. WCF имеет свою собственную безопасность . Вы должны использовать это вместо того, чтобы писать свой собственный.

0 голосов
/ 29 июля 2009

Это не должно быть слишком сложно сделать - есть пара мест, где вы можете отразить атрибут и обработать его соответствующим образом:

  • При запуске приложения в Global.asx вы можете настроить маршрутизацию и расположение для представлений

  • Основные события запроса ASP.Net по-прежнему срабатывают, поэтому вы можете переопределить одно из них

  • Создайте свой собственный базовый контроллер и переопределите OnActionExecuting


Обновить следующий комментарий

Ааа, понятно. В этом случае, если вы делаете прямые звонки, вы должны проверить Code Access Security , который, я думаю, охватывает то, что вы имеете в виду.

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

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

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