Я не думаю, что есть какое-то одно решение, подходящее всем для этой проблемы, вам нужно будет проанализировать и настроить свое решение для конкретной проблемы, с которой вы столкнулись.
Насколько мне известно, не существует известных способов безопасного хранения информации о вашем соединении на стороне клиента, поскольку ваш клиент является «доверенной» частью связи с сервером. Независимо от того, как вы храните информацию, клиент должен иметь возможность отменить ее или отправить ее непосредственно на сервер, что также означает, что потенциальный злоумышленник может повторить процесс. Также любая внешняя связь непосредственно с вашей базой данных может быть потенциально перехвачена / взломана.
Лучший способ защитить ваши данные - использовать веб-сервис (через безопасное соединение) в качестве промежуточного программного обеспечения, управляющего взаимодействием с вашей базой данных (, которое необходимо защитить ), и добавлять логику для принудительного применения любой уровень безопасности вы хотите достичь. Вы можете создать учетную запись на основе предоставления различных уровней доступа, если это необходимо. Но главное, что он допускает только безопасные / изолированные операции.
Для защиты веб-службы (промежуточного программного обеспечения) существуют две проблемы: аутентификация и изоляция.
Аутентификация
Вы можете использовать стандартную аутентификацию .NET, как предложил Стивен. Я обычно предпочитаю использовать собственное решение по двум причинам. Прежде всего, до сих пор я в основном работал с более сложными пользователями / ролями. Например, использование ролей на основе разрешений, чтобы вы могли проверять наличие разрешений вместо конкретных ролей.
И, во-вторых, это дает вам больше контроля. Вы можете избежать аутентификации на основе сеанса , а также можете использовать вызов-ответ , например, вызов с временной меткой и ожидание хэша временной метки + пароль (который пользователь должен ввести при запуск приложения) или какая-то другая творческая комбинация в качестве ответа, я уверен, что есть лучшие хеш-комбинации для ответа. Это также следует сделать двусторонним, чтобы убедиться, что клиент проверяет все, что получает от сервера.
Также вот некоторые SO темы о авторизации WCF, которые могут быть интересны:
Шаблоны авторизации службы WCF
Авторизация и аутентификация с использованием WCF
Авторизация WCF - доступ к операциям через заявки
А также книга и бумага (не бесплатно)
Изоляция
Независимо от того, насколько безопасна ваша аутентификация, всегда есть вероятность, что кто-то сможет получить доступ к вашему веб-сервису с злонамеренными намерениями. Насколько я знаю, нет единого решения этой проблемы, но это скорее зависит от конкретного приложения и от того, как данные структурированы и распределены между пользователями.
Вам нужно будет определить уровни изоляции, чтобы пользователи не могли влиять друг на друга или на систему в целом, а также на то, как используется приложение. Потребуется ли клиентам записывать данные или только читать? Если они пишут, передаются ли письменные данные каким-либо образом и каким образом вы можете изолировать / проверить эти данные? Если они читают, является ли информация частной для пользователя, частной для системы или общей для пользователей?
Например, система хранения медицинских журналов или личных списков задач будет иметь очень изолированные данные, и вы можете ограничить доступ только к вашей личной информации (и, возможно, к вашему врачу / начальнику в зависимости от групп пользователей). В этом случае вы можете изолировать все данные для чтения / записи для конкретного пользователя, таким образом, злоумышленник может воздействовать только на свои собственные данные, обеспечивая безопасность всех остальных.
Если данные распределяются между пользователями, вам потребуется какой-либо способ проверки ввода, который дается от пользователя. Желательно, чтобы у вас также был какой-то уровень доверия для пользователя, например репутация SO, для предотвращения попыток взлома однократными пользователями. Это действительно слишком конкретный вопрос, чтобы давать какие-либо полезные советы.
Вам также необходимо правильно проверить ввод, который вы получаете, чтобы предотвратить взломы, такие как переполнения буфера и SQL-инъекции . Несмотря на то, что я не знаю, является ли переполнение буфера проблемой в .NET, и инъекции SQL легко предотвратить с помощью LINQ-to-SQL.
В целом, не существует 100% гарантированного способа защиты ваших данных, и вы должны регулярно создавать резервные копии (отдельно от вашей базы данных) своих данных на случай, если они скомпрометированы, и, вероятно, также журналы транзакций.
И, наконец, если вы действительно серьезно относитесь к безопасности, вам, вероятно, следует нанять консультанта по безопасности и взглянуть, как банки настраивают свою инфраструктуру безопасности.
Также вы все еще можете использовать LINQ с веб-сервисами через LINQ to ADO.NET , хотя я сам не пробовал.
Эта ссылка может быть более объяснительной Как перейти от LINQ к SQL к «LINQ to WCF»?