2013-09-25 4 views
1

Я нашел некоторое решение для обеспечения безопасности на основе сущности. Как пользователь может получить доступ только к сущности, к которой он имеет доступ.Безопасность на основе сущностей в asp.net MVC4

Вместо того, чтобы проверять каждый метод действий, я могу централизованно управлять. Я здесь говорю о сущности доступа, используя также вызов ajax. Например, пользователь открыл orderId 10, потому что у меня есть скрытое поле, если каким-либо образом, если он изменит значение orderId до 11, он может получить доступ или изменить порядок с orderId 11, пока ему разрешено видеть только orderId 10.

Есть время, когда мы просто отправляем некоторые значения вместе с идентификатором основной сущности, например getOrderByUserId (int userId), поскольку этот метод действия находится в OrderController, осуществляющем доступ к порядку на основе userId.

+0

В чем тут вопрос? –

ответ

2

Пожалуйста, посмотрите на AuthorizeAttribute и роли в конкретной

использования:

[Authorize(Roles = "manager,admin")] 
public ActionResult myMethod(){ 

// your code 
} 

И вы можете использовать Users свойство и сделать что-то вроде этого:

[Authorize(Users = UsersHelper.GetAllowedUsers)] 
public ActionResult myMethod(){ 

// your code 
} 

где UsersHelper.GetAllowedUsers является статический класс со статическим методом, который возвращает пользователей в таком формате: "joe1,admin,momandpop"

обновление OP комментарий:

/// <summary> 
/// Checks if the current user is the owner of the Order 
/// </summary> 
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public class IsOwnerOfOrderAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     if (!(filterContext.Result is HttpUnauthorizedResult)) 
     { 
      // code to check if user has the order he is trying to edit 
      // if not return this 
      filterContext.Result = new HttpUnauthorizedResult(); 
     } 
    } 
} 

вы можете поместить это в верхней части контроллера или конкретного действия.

+0

GetAllowedUsers, nice +1 –

+0

Но я ожидал более общего решения, т. Е. Какая-то вещь может получить идентификатор пользователя, поскольку он знает, что это пользователь на основе (пользователя) (Id) и authenticate. Пример для примера будет getOrderByProductId (int productId) , Это тот случай, когда мы показываем некоторый заказ на основе продукта, но я хочу ограничить пользователя тем, что он не может изменить сущность заказа, если пользователь меняет скрытое поле моего представления, которое содержит orderId.Putting authorize для каждого метода действий не апеллирует к использованию fluentSecurity. – user1394622

+0

, тогда вам нужно сохранить список каждого заказа для каждого пользователя, и если у пользователя нет этого идентификатора заказа, ему будет отказано в доступе. образец, чтобы следовать – Aviatrix

0

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

Для этого вам необходимо поддерживать иерархию пользовательских ролей, а затем сохранять минимальную роль, которая может выполнять редактирование или любое действие в каждой строке таблицы.

Если вы хотите заблокировать пользователя от использования параметра запроса, вы можете использовать параметр или сеанс или TempData для передачи данных между действиями для передачи id и работы.

+0

Я немного не понимаю, что вы предлагаете здесь. У меня есть простое требование, чтобы ни один пользователь не мог изменять данные объекта, которому он не разрешен, он может быть основан на пользовательских правилах, таких как то, что у него есть. Я не хочу проверять каждый метод действий. – user1394622

+0

Для записи Проверяйте коды только один раз, создайте BaseController, который проверит необходимые проверки в функции как 'protected override void OnActionExecuting (ActionExecutingContext filterContext) {', а контроллер, который должен проверить это, расширит этот базовый контроллер. – serene

+0

это проверит каждое действие, выполняющее событие контроллера, которое его расширяет, но согласно вашему вопросу вам необходимо выполнить проверку каждой строки ... данных из таблицы. – serene

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