2015-10-21 2 views
1

В веб-приложении интрасети в моей компании многочисленные операции имеют гранулярную пользовательскую систему безопасности, которая используется в каждом методе action/http в наших MVC-контроллерах. В основном есть две перечисления; один представляет собой набор действий, которые могут быть выполнены (это чрезвычайно гранулировано, практически каждое возможное действие имеет соответствующее значение в перечислении), а один представляет собой набор наших подкомпактов. В контексте этого вопроса я буду называть эти перечисления Action и Company.Как правильно настроить атрибут для пользовательской безопасности в MVC 4?

Каждый пользователь нашей системы связан с одним Company и нолем или более Action s. Внутри каждого метода в наших контроллерах, где-то по пути есть проверка, имеет ли текущий пользователь права Action и Company значение, которое будет использовать эту функцию. Каждый контроллер имеет в него «UserHelper», который содержит Company и список Action, с которым связан аутентифицированный пользователь.

Приближается к этому способу, существует много дублирования кода, в котором каждый метод выполняет свою собственную проверку этих значений перечисления и реагирует на нарушения, когда это необходимо. Я надеюсь уменьшить все это до System.Attribute или System.Web.Mvc.AuthorizeAttribute, которые мы можем поставить на контроллеры или методы, чтобы автоматически обрабатывать нарушения единым способом и не нужно проверять его в рамках методов. Что-то похожее на:

public class MyController : Controller 
{ 
    [RequireActionAndCompanyAttribute(Action = Action.MyMethod, Company = Company.AbcInc)] 
    MyMethod() 
    { 
     // do stuff, but don't bother checking for the security values 
    } 
} 

Как уже упоминалось, я предполагаю, что я могу наследовать от System.Attribute или System.Web.Mvc.AuthorizeAttribute для этой цели. Однако я боюсь. Я не уверен, как адаптировать AuthorizeAttribute, чтобы использовать нашу собственную внутреннюю реализацию безопасности (на основе Action и Company), а не одну из систем членства ASP.NET. И простой старый System.Attribute кажется настолько расплывчатым, что я думаю, что он не был предназначен для такого использования вообще. Я также не уверен, как я должен передавать что-либо методам в атрибуте. Когда я помещаю атрибут в метод, я просто хочу указать, что необходимо для продолжения Action и Company, как в приведенном выше фрагменте кода. Но тогда, как мне передать фактические значения пользователя для них в метод проверки атрибута?

+0

Как вводится «UserHelper»? –

+0

@ DanielGpeReyes - На данный момент каждый контроллер имеет UserHelper, введенный параметром в свой конструктор, и сохраняет его в частном поле readonly. – bubbleking

+0

можете ли вы разместить свой UserHelper? –

ответ

2

Используйте собственный атрибут, унаследованный от ActionFilterAttribute, а не AuthorizeAttribute. Вы можете ввести свой UserHelper в этом классе и переопределить метод OnActionExecuting и установить свойство Result контекста, если ваше условие не выполнено.

+0

Где я могу ввести UserHelper? – bubbleking

+1

Как вы теперь вводите его в свой контроллер? Какую структуру вы используете? Вы можете разрешить это непосредственно из контейнера? В противном случае вы можете получить его с контроллера через свойство Controller ActionExecutingContext –

+0

. Мы используем инфраструктуру внедрения зависимостей Unity. Я не уверен, как разрешить что-то из контейнера. Свойство Controller для ActionExecutingContext не имеет UserHelper. – bubbleking

Смежные вопросы