Как заблокировать службу данных WCF .net 4.0

У меня была опубликована служба данных WCF около 2 месяцев. Это уже 100% взломано. Я даже заметил сервис, опубликованный в твиттере!

К счастью, мой сайт находился в стадии разработки, и его пользователем было всего около 80 бета-тестеров.

Тем не менее, это довольно большая проблема. Используя возможности E.F. Navigation, любой может легко написать сценарий для загрузки всех моих пользовательских данных и моих ценных данных домена, которых больше ни у кого нет. Я хочу предоставить доступ без аутентификации и делать что-то вроде:

  1. Ограничьте количество отображаемых столбцов (например, электронные письма пользователей)
  2. Ограничьте количество запросов, возможных в день (например, 10 на адрес хоста запроса)
  3. Получать уведомления, когда кто-то злоупотребляет сервисом
  4. Ограничьте набор результатов и расширьте параметры для разных наборов сущностей
  5. То, о чем я еще не думал

Имеет ли это смысл, или мне следует отказаться от WCF Data Services - что в теории звучит отлично, но теперь, когда у меня есть опыт работы с ними, мне интересно, подходят ли они только для разработки, а не для производства (они немного толще, чем Я ожидал).

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

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


person Jonathon Kresner    schedule 30.04.2011    source источник


Ответы (3)


Я думаю, вам нужно реализовать некоторую аутентификацию. Я не могу придумать другого способа «заблокировать» веб-службу. Это одно из преимуществ WCF - он упрощает реализацию сложной аутентификации.

person Hogan    schedule 30.04.2011

В моей службе WCF мне нужен объект UserContext, состоящий просто из двух строк, имени пользователя и пароля.

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

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

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

person Mikecito    schedule 30.04.2011
comment
Должен быть задан вопрос, в котором говорилось, что мне нужен неаутентифицированный доступ. Возможно мне нужен какой-то ключ приложения и мое желание не совсем правдоподобно. - person Jonathon Kresner; 30.04.2011
comment
Ключ приложения сработает, чтобы удержать их еще на 3 секунды. Без какого-либо индивидуального ключа или имени пользователя / пароля он анонимен и может быть использован для злоупотреблений. Я думаю, вы можете заблокировать его по IP, если их IP-адреса статические. - person Mikecito; 30.04.2011

1 - Службы данных WCF в настоящее время не позволяют легко фильтровать столбцы по запросу. У вас может быть две модели EF (одна «общедоступная» и одна «частная») и предоставлять их как две службы. Публичный доступный для всех, частный за полной авторизацией.

2 - Это вам придется реализовать самостоятельно. Но для того, чтобы это сработало, вам нужен способ идентифицировать пользователя. Так что это довольно близко к аутентификации (даже если для этого не требуется пароль или что-то в этом роде). Здесь есть серия сообщений об аутентификации через службы данных WCF: http://blogs.msdn.com/b/astoriateam/archive/tags/authentication/.

3 - Если вы можете идентифицировать пользователя согласно пункту 2, вы можете, например, подсчитать количество или частоту или запросы, которые он / она делает, и настроить уведомление на основе этого. Опять же, методы, используемые для аутентификации, должны предоставить вам правильные крючки.

4 - Это достаточно просто. Служба данных WCF позволяет установить жесткое ограничение на размер ответа (DataServiceConfiguration.MaxResultsPerCollection) или мягкое ограничение, что означает разбиение на страницы. Пейджинг обычно лучше, поскольку он ограничивает размер одного ответа, но все же позволяет клиентам получать все данные с помощью нескольких запросов. Это можно сделать с помощью DataServiceConfiguration.SetEntitySetPageSize. Поведение exand может быть ограничено использованием свойств DataServiceConfiguration.MaxExpandCount и MaxExpandDepth.

Некоторые другие возможные методы использования

  • Перехватчики запросов (http://msdn.microsoft.com/en-us/library/dd744842.aspx) - это позволяет фильтровать строки по базам запросов. Обычно используется для ограничения строк на основе запроса пользователя (обратите внимание, что это позволяет фильтровать только строки, но не столбцы).

  • Операции службы - если вы определяете операцию службы, которая возвращает IQueryable, клиент по-прежнему может составлять запросы поверх нее, но это дает вам возможность фильтровать данные перед применением запроса. Или вы можете сделать определенные части информации доступными только через сервисные операции (не так просто в использовании и не запрашивать, но это дает вам полный контроль). (http://msdn.microsoft.com/en-us/library/cc668788.aspx)

person Vitek Karas MSFT    schedule 30.04.2011