В веб-приложении интрасети в моей компании многочисленные операции имеют гранулярную пользовательскую систему безопасности, которая используется в каждом методе 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
, как в приведенном выше фрагменте кода. Но тогда, как мне передать фактические значения пользователя для них в метод проверки атрибута?
Как вводится «UserHelper»? –
@ DanielGpeReyes - На данный момент каждый контроллер имеет UserHelper, введенный параметром в свой конструктор, и сохраняет его в частном поле readonly. – bubbleking
можете ли вы разместить свой UserHelper? –