Как лучше защитить запросы Json в приложении Mvc? - PullRequest
0 голосов
/ 01 сентября 2011

Мое приложение MVC состоит из администратора и обычных пользователей.Пользователи с правами администратора могут регистрироваться как разные клиенты, использующие систему, и они могут добавлять своих соответствующих пользователей в систему.

Контроллеры уже имеют фильтры авторизации на определенных контроллерах для предотвращения несанкционированного доступа к определенным страницам / json.

Однако, скажем, у меня есть пользователь-администратор, вошедший в систему, что мешает ему проверять сообщения / сообщения Json в JavaScript и вручную вызывать 'get' с идентификатором определенных данных, которые нужно просмотреть?Например, / Users / 1

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

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

например, Текущая реализация

public class PeopleController : ApplicationController
{
    public ActionResult GetMemberDetails(int memberId)
    {            
        var member = _peopleService.GetMemberById(memberId);
        return Json(member, JsonRequestBehavior.AllowGet);
    }
}

public class PeopleService : IPeopleService
{
    public MemberModel GetMemberById(int memberId)
    {
        // Void function which throws Unauthorised exception
        MemberAccessCheck(memberId);

        var member = Mapper.Map<Member, MemberModel>(_memberRepository.GetById(memberId));
        return member;
    }
}

Функция MemberAccessCheck вызывается много раз в моемсервис.

Ответы [ 3 ]

1 голос
/ 01 сентября 2011

Вам следует рассмотреть возможность размещения всех ваших функций администратора в Районе. Если вы это сделаете, то вы можете использовать Маршрут для Района для реализации RouteConstraint, который может проверять идентификатор, представленный в запросе AJAX, чтобы определить, находится ли он в области действия запрашивающего пользователя. Ваш гипотетический маршрут в файле AreaRegistration.cs для области будет выглядеть следующим образом:

public override void RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(
        "Admin_default",
        "Admin/{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional },
        new { id = new IsActionAuthorized() }
    );
}

Тогда ваша RouteConstraint будет выглядеть примерно так:

public class IsActionAuthorized : IRouteConstraint 
{ 
    public IsActionAuthorized() 
    { } 

    private MyEntities _db = new MyEntities();

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    {
        // return true if no id was submitted
        if (String.IsNullOrEmpty(values[parameterName]))
            return true;

        // return true if action is authorized
        var requestId = Convert.ToInt32(values[parameterName]);
        var authorized = false;

        // code to check against requester's id, to determine
        // if requestedId is within requester's authority
        // set authorized to true only if the request is authorized for this requester

        return authorized;
    } 
} 

Это дает вам единую точку входа, где вы можете выполнить необходимые тесты сторожевого устройства. Если тесты не пройдены, запрос потерпит неудачу при маршрутизации и вернет ошибку 404.

1 голос
/ 01 сентября 2011

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

Я предлагаю, чтобы у вас был метод службы, который принимает текущий идентификатор пользователя от контроллера (берет User.Identity) и отправляет его службе, чтобы получитьсписок пользователей или отдельных пользователей, которые они могут просматривать / изменять.Так что не обязательно заваливать проверками доступа, но так будет работать ваша служба (бизнес-правило).

Например, метод обслуживания:

User GetAdminUser(int userId, int adminId);
List<User> GetAdminUsers(int adminId);

Или просто перегрузить предыдущую службу

User GetUser(int userId);
User GetUser(int userId, int adminId);
0 голосов
/ 01 сентября 2011

Однако, скажем, у меня есть пользователь-администратор, который мешает им проверка JSON сообщений / получает в JavaScript и вручную вызывая получить с идентификатором конкретных данных для просмотра? например / Пользователи / 1

Ничего, правда.

Вы можете использовать HTTPS для этих запросов, чтобы, по крайней мере, данные были зашифрованы.

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

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

Этот код, как правило, очень специфичен для приложения, поэтому не так много "фреймворков", которые бы его обрабатывали. Лучше всего было бы написать этот код так, чтобы его можно было легко подключить к вашему приложению везде, где вам это нужно.

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