Как безопасно использовать Entity Framework / C # и SQL Server через Интернет - PullRequest
0 голосов
/ 15 июня 2019

В настоящее время я занимаюсь разработкой приложения на C # / WPF / MVVM / EF6, которое позволяет нескольким пользователям в разных физических местах отправлять и получать SMS-сообщения на мобильные телефоны с помощью стороннего API.

База данных хранит все сообщения, отправленные и полученные, и обновляется либо непосредственно пользователем (отправка сообщения), либо через веб-ловушку ASP.NET (получение сообщения). Пользователи используют аутентификацию SQL и динамически создаваемые строки подключения для подключения к базе данных (т.е. передают строку подключения при каждом создании нового DbContext). EF используется для запроса и отображения данных.

Сейчас я столкнулся с тем, что, по моему мнению, может быть фундаментальной проблемой безопасности в моем дизайне. Всем пользователям необходим прямой доступ к базе данных SQL для использования методов Entity Framework. После некоторых исследований кажется очень рискованным просто выставить SQL Server в Интернет. Большинство предложений заключалось в использовании VPN или белых списков IP-адресов, но, к сожалению, ни один из этих вариантов не подходит. У нас будет SQL Server, размещенный третьей стороной, которая не будет предоставлять VPN, и пользователи будут часто находиться в разных местах, поэтому их IP-адреса не будут статичными.

Существуют ли дополнительные параметры для обеспечения прямого доступа к SQL Server с дополнительной безопасностью? Единственный вариант, о котором я могу подумать, - это полностью изменить архитектуру, создав API для приложения, которое будет запрашивать и реорганизовывать код для извлечения данных с использованием API вместо Entity Framework. Любой вклад будет высоко оценен.

Ответы [ 2 ]

2 голосов
/ 15 июня 2019

Вы можете создать API , который будет иметь доступ непосредственно к базе данных, API будет отображаться через Интернет, и вы будете определять только те методы, которые вы хотите выполнять в базе данных (например, операции CRUD).

Приложение wpf больше не будет напрямую взаимодействовать с базой данных, а вместо этого будет связываться с API.API - это тот, который содержит строку подключения, и единственный, кто будет иметь прямой доступ к БД.Таким образом, вы не подвергаете всю свою базу данных через Интернет.

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

Теперь вам нужно провести рефакторинг вашего приложения для работы с API.Хотя, если вы использовали что-то вроде Шаблон репозитория , для правильной работы потребуется всего лишь несколько изменений в самом репозитории.

Теперь в дизайне вашего приложения есть еще один уровень абстракции - API * 1017.*

Приложение WPF → API → База данных

То, как я использую API в своих приложениях, использует класс HttpWebRequest.Однако есть и другие способы справиться с этим, и эта статья объясняет это очень хорошо: Несколько замечательных способов использования RESTful API в C #

0 голосов
/ 15 июня 2019

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

  1. Разрешение всей строки подключения хранилища клиента слишком рискованно и сложно в случае, если вы хотите масштабировать свой проект,особенно приложение Windows, как WPF в вашем случае.Таким образом, наличие адаптера дает вам возможность беспрепятственно обновлять и поддерживать.

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

Идея, которую я мог бы себе представить, - создать WebAPI и позволить ему динамически создавать пользователей SQL для каждого клиента с ограниченными разрешениями.Затем периодически отзывайте пользователя SQL каждый раз (может быть, с помощью Webjob).Таким образом, у клиента не будет долгоживущей строки подключения.И вам понадобится только одна конечная точка.

Клиент должен запросить в WebAPI временную строку подключения.С этим решением у вас будет, по крайней мере, возможность проверить учетные данные клиента, его роль, ip, номер версии и т. Д., Прежде чем дать им строку подключения, когда строка подключения была отозвана.Это все еще требует API.Но, по моему мнению, клиент будет напрямую связываться с базой данных с большей безопасностью.

ПРИМЕЧАНИЕ. Так как вы позволяете клиентам играть с базой данных.Убедитесь, что клиент всегда последняя версия.Я думаю, вы можете проверить, когда клиент запрашивает строку подключения.

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