Как заблокировать службу данных .net 4.0 WCF - PullRequest
2 голосов
/ 30 апреля 2011

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

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

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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 30 апреля 2011

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

2 голосов
/ 30 апреля 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)

2 голосов
/ 30 апреля 2011

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

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

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

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

...