MVC3 Многопользовательский уровень безопасности данных - PullRequest
2 голосов
/ 18 января 2012

Приложение, над которым я работаю, является многопользовательским и многопрофильным, и в настоящий момент у меня возникают проблемы, когда я пытаюсь найти наиболее эффективный / лучший способ обеспечения безопасности на уровне данных, в широком смысле не позволяющий UserA видеть данные UserB.,Если существуют различные контроллеры (Продукты, Заказы и т. Д.) И модели, то маршруты представляют собой что-то вроде Product / Edit / 1 и Order / Edit / 1.Тем не менее, чтобы гарантировать, что пользователи не смогут изменять маршруты для просмотра данных друг друга, кажется, что каждый вызов уровня обслуживания / уровня базы данных потребует от меня проверки того, что конкретный ключ продукта / ключ заказа принадлежит аутентифицированному пользователю?Это лучший вариант или мне не хватает чего-то более элегантного.

Редактировать обновление

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

public class ProductController
{
    public ActionResult Edit(int id)
    {
        if (_productService.CanUserEdit(id, userID))
        {
            _productService.Save(id);
        }
        else
        {
            throw UnauthorizedException;
        }

        return RedirectToAction("Index");
    }
}

ИЛИ

public class ProductController
{
    public ActionResult Edit(int id)
    {
        _productService.Save(id, userID);

        return RedirectToAction("Index");
    }
}

public class ProductService
{
    public void Save(int id, int userID)
    {
        if (CanUserEdit(id, userID))
        {
            //DO SAVE
        }
    }

    private CanUserEdit(int id, int userID)
    {
    }
}

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

1 Ответ

1 голос
/ 18 января 2012

Кажется, что есть два распространенных подхода: OnActionExecuting или AuthorizeAttribute. Посмотреть здесь: Как расширить / спроектировать атрибут авторизации ASP.NET MVC 3 для обработки этого сценария

ASP.NET MVC 3 также имеет глобальные фильтры действий, которые позволяют применять глобальные фильтры действий без необходимости явного объявления атрибутов: http://blog.tallan.com/2011/02/04/global-action-filters-in-asp-net-mvc-3/

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