Ограничение доступа к методам контроллера в ASP.NET MVC 3 - PullRequest
4 голосов
/ 05 декабря 2011

У меня есть сайт со страницей, содержащей несколько вкладок, и при выборе одной из них ее содержимое извлекается с сервера с помощью вызова AJAX. Каждая вкладка загружается через другой контроллер. Например, у меня есть страница клиента, которая содержит вкладки «Продукты» и «Клиенты».

На сайте есть разные типы пользователей с разными уровнями разрешений.

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

http://localhost/MyApp/Products/1

где 1 - идентификатор базы данных продукта.

Я могу реализовать эти 2 решения, но ни одно из них не является оптимальным:

  1. Используйте атрибут ChildOnlyAction. Я бы пометил действия контроллера Product этим атрибутом и отобразил бы вкладки из основного представления, используя RenderAction. Но это будет означать, что все вкладки на странице должны будут отображаться, что не является оптимальным, поскольку я хочу загружать данные только тогда, когда пользователь нажимает на вкладку.

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

Мне интересно, есть ли лучший подход к этому.

Ответы [ 2 ]

4 голосов
/ 05 декабря 2011

Похоже на то, что предложила Ромиас. Вы можете объединить метаатрибут Authorize с пользовательским фильтром IAuthorizationFilter.

Когда вы реализуете метаатрибут Authorize, вы указываете список пользователей или ролей, которые должны иметь разрешение на это действие. Отсутствует возможность использовать базу данных, чтобы указать, к какому идентификатору должен иметь доступ пользователь.

Именно в этом сопоставлении ID-пользователя и вступает в игру IAuthorizationFilter. В фильтре вы можете сравнить текущего пользователя с базой данных.

Пример IAuthorizationFilter и его использование можно найти на следующей странице:

http://geekswithblogs.net/brians/archive/2010/07/08/implementing-a-custom-asp.net-mvc-authorization-filter.aspx

3 голосов
/ 05 декабря 2011

Вы пытались использовать фильтр авторизации для украшения контроллеров, которые вы хотите защитить?

[Authorize(Roles = "UserType1")]

Вы также можете расширить фильтр авторизации, чтобы добавить собственную логику. Здесь вы можете увидеть пример расширения фильтра авторизации: https://stackoverflow.com/a/428266/7720

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