Как защитить доступ к действиям MVC, которые возвращают JSON

У меня есть общедоступный веб-сайт, разработанный с помощью ASP.NET MVC 3. Приложение MVC содержит контроллеры с действиями, которые возвращают JSON. Веб-страницы выполняют запросы AJAX к действиям, которые возвращают JSON.

Несмотря на то, что данные, публикуемые с помощью действия JSON, не являются конфиденциальными, они являются собственностью, и я обеспокоен тем, что любой может вызвать действия, которые возвращают JSON, посредством междоменных вызовов или пользовательских приложений. Есть ли способ разрешить веб-страницам моего приложения MVC доступ только к действиям, которые возвращают JSON? Предоставляет ли ODATA какие-либо преимущества для решения этой проблемы?

Кто-нибудь знает ресурсы, которые описывают эту проблему как пассив и как ее решить?


person Mike Barlow - BarDev    schedule 27.03.2011    source источник


Ответы (5)


Если ваше приложение является общедоступным, то это более сложно. Есть атрибут ValidateAntiForgeryToken, который может помочь против XSS и случайных запросов.

Если у вас есть защищенный паролем сайт, используйте атрибут Authorize.

OData имеет тот же набор проблем, что и сайт MVC.

person Daniel A. White    schedule 27.03.2011

Если вы используете роли, вы можете ограничить доступ с помощью атрибута авторизации.

person sajoshi    schedule 28.03.2011

У меня аналогичная настройка, но на моих устройствах iOS приходится взаимодействовать со страницами, которые отвечают в формате JSON. В итоге я создал ActionFilterAttribute, который проверяет, что устройство 1) добавлено в список разрешенных устройств по его UDId и 2) что пользователь, назначенный устройству, активен (в настоящее время используется). Проблема в том, что это заставляет меня выполнять POST-запросы, что для меня на самом деле не проблема, но для вас это может быть, поскольку вы можете разрешать запросы GET. Я также могу ошибаться, я думаю, что связыватель модели все равно будет анализировать объекты из запроса GET, и фильтр, вероятно, все еще будет работать.

В любом случае, вот код моего фильтра как есть, модификатор на ваше усмотрение:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
internal sealed class VerifyDeviceAttribute : ActionFilterAttribute {
    [Inject]
    public DeviceProvider DeviceProvider { private get; set; }

    public override void OnActionExecuting(
        ActionExecutingContext ActionExecutingContext) {
        string UDId = ActionExecutingContext.HttpContext.Request.Form["Authorization.UDId"];

        if (this.DeviceProvider.Exists(UDId) && !this.DeviceProvider.Get(UDId).User.Active) {
            ActionExecutingContext.Controller.ViewData.ModelState.AddModelError("User", "The user is not active");
        } else if (!this.DeviceProvider.Exists(UDId)) {
            ActionExecutingContext.Controller.ViewData.ModelState.AddModelError("UDId", "The UDId is empty");
        };
    }
}

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

person Gup3rSuR4c    schedule 27.03.2011

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

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

person Michael Shimmins    schedule 28.03.2011

Вы можете использовать ValidateAntiForgeryToken, чтобы запретить людям делать запросы к вашим методам, однако, поскольку вы работаете с данными на стороне клиента, у них есть множество других способов получить доступ к вашим данным после их отправки клиенту. Вы можете сделать очень мало (если вообще что-либо) для предотвращения того, чтобы данные или информация, которые вы разрешаете быть общедоступными, каким-либо образом добывались.

person Jason Yost    schedule 29.03.2011