Как настроить соединение с базой данных надежно

Подобный, но не то же:

Привет все, у меня есть приложение C# WinForms, соединяющееся с сервером базы данных. Строка соединения с базой данных, включая основного пользователя / передача, помещается в конфигурационный файл NHibernate, который находится в том же каталоге как EXE-файл.

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

Кроме того, я мог hardcode строка подключения, которая плоха, потому что администратор должен смочь изменить его, если база данных перемещена или если он хочет переключиться между dev/test/prod средами.

Так долго я находил три возможности:

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

    Но это не находится недостаточно в моем случае (пользователь, запускающий приложение, является человеком. База данных, user/pass, является общей и не должна даже быть доступной человеком.)

  2. Первый ответ дополнительно предложил зашифровать данные о соединении прежде, чем записать это в файл.

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

  3. Второй вопрос, на который ссылаются, обеспечивает подход для этого самого сценария, но это кажется очень сложным.

Мои вопросы Вам:

  1. Это - очень общий вопрос, так нет ли никакой общий "how-to-do-it" путь, так или иначе "шаблон разработки"?

  2. Есть ли в инфраструктуре конфигурации.NET некоторая поддержка?

  3. (дополнительный, возможно, из объема), я могу объединить это легко с механизмом конфигурации NHibernate?

Обновление:

В ответ на первые ответы: существует несколько причин, почему я хотел бы соединиться с базой данных непосредственно и не использовать веб-сервис:

  • (N) Будьте в спящем режиме может только использоваться с базой данных, не веб-сервисами (действительно ли я прав?)
  • Мы планируем обеспечить офлайновую возможность, т.е. если база данных или сеть должны снизиться, пользователь может продолжить свою работу. Для управления этим я думаю о наличии локального, в - proc база данных, например, Компактный SQL Server, и использование платформы Синхронизации MS для синхронизации его с базой данных сервера, как только это произошло снова.

У Вас есть дальнейшие идеи, принимая это во внимание?

7
задан Community 23 May 2017 в 10:28
поделиться

4 ответа

На самом деле подход WebService (упомянутый в другом ответе) означает, что вы перемещаете NHibernate и его логику в веб-службу. Затем WebService предоставляет доступную приложению функциональность db с помощью методов WebService.

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

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

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

Я фактически сделал это, используя веб-сервис, который взаимодействовал с БД и Приложение WinForm (.NET Compact Framework), которое общается только с веб-сервисом, и в случае отсутствия покрытия сотовой сети оно будет сериализовать изменения на карту памяти (данные не были важны, поэтому в моем случае неясные / непристойные меры безопасности, где не были приняты)

ОБНОВЛЕНИЕ с небольшим примером по запросу (хотя я нахожу странным просить пример по этому поводу)

вы настроили классы домена и конфигурацию nhibernate и (например) свой репозиторий в проекте введите Приложение ASP.NET WebService. Для простоты у меня будет только один класс веб-службы Foo (в Foo.asmx.cs), а также один доменный класс Bar

так что вы получите это (фактическая реализация может быть разной):

namespace FWS
{
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class FooService : WebService
    {
        private readonly ILog errorLogger = LogManager.GetLogger("ErrorRollingLogFileAppender");
        private readonly IDaoFactory daoFactory = new DaoFactory();
        private readonly ISession nhSession =  HibernateSessionManager.Instance.GetSession();
    }

    [WebMethod]
    public Bar[] GetFavoriteBars(string someParam, int? onceMore){
        return daoFactory.GetBarDao().GetFavoriteBars(someParam, onceMore); //returns a Bar[]
    }
}

и мы абстрагируем daobehaviour, или просто используем nhsession напрямую, как веб-метод.

Теперь из приложения WinForm все, что вам нужно сделать, это Добавить WebReference , который вносит все необходимые изменения в конфигурацию, но также генерирует все необходимые классы (в этом примере создается панель Bar в том виде, в каком его предоставляет веб-сервис).

namespace WinFormK
{
    public class KForm(): System.Windows.Forms.Form
    {
        public void Do()
        {
            var service = new FWS.FooService();
            string filePath = "C:\\temp\FooData.xml";
            Bar[] fetched = service.GetFavoriteBars("yes!", null);

            //lets write this to local storage
            var frosties = new XmlSerializer(typeof(Bar));
            TextReader reader = new StreamReader(filePath);

            try
            {
                var persisted = (T)frosties.Deserialize(reader);
            }
            catch(InvalidOperationException)
            {
                //spock, do something
            }
            finally
            {
                reader.Close();
                reader.Dispose();
            }
        }
    }
}

есть некоторые вещи, на которые вы должны обратить внимание:

  • Вы, по сути, теряете ленивые вещи, или, по крайней мере, вы теряете их в своем приложении winform. Сериализатор XML не может сериализовать прокси, и поэтому вы либо отключаете ленивую выборку этих коллекций / свойств, либо используете атрибут [XmlIgnore], который, в свою очередь, делает то, что подразумевает при сериализации.
  • Вы не можете возвращать интерфейсы в подписях WebMethod. Это должны быть конкретные классы. Таким образом, возвращаемый IList должен быть преобразован в List или что-то подобное
  • Веб-сервис выполняется IIS и виден из веб-браузера. . По умолчанию будут обслуживаться только запросы локального браузера (но это можно изменить), поэтому вы можете протестировать свой уровень доступа к данным отдельно от того, что делает ваша winform.
  • Принимающая сторона (приложение winform) вообще ничего не знает о NHibernate.
  • В приведенном выше примере я сохранил то же имя для dao-методов для веб-методов; Пока вы не сохранили методы, специфичные для nhibernate, в вашем dao (скажем, как параметр NHibernate.Criterions.Order ), вы, вероятно, не найдете проблем. Фактически у вас может быть столько же .asmx в вашем веб-сервисе по своему усмотрению, возможно, даже «сопоставьте» их с соответствующими dao (например, публичный класс FooService: WebService , публичный класс BarService: WebService , ] открытый класс CheService: WebService , где каждый соответствует DAO).
  • Вам, вероятно, придется написать какой-то метод опроса между вашими конечными точками, чтобы ваши представленные данные оставались актуальными.
  • Данные WebService подробны; крайне так. Желательно застегнуть их или что-то в этом роде, прежде чем отправлять их по проводам (и, возможно, зашифровать их)
  • Win-приложение знает только запись конфигурации: http: //server/FWS/FooService.asmx
  • Сеанс веб-служб отключен по умолчанию. помните об этом перед началом использования сеанса для пользовательских данных.
  • Вам, вероятно, придется написать какую-то аутентификацию для веб-службы
  • В приведенном выше примере я возвращаю Bar [] с Bar , отображаемым с помощью nhibernate. Чаще всего это может быть не так, и вам может потребоваться написать вспомогательный класс WSBar , где он адаптирует исходный класс Bar к тому, что может потреблять веб-сервис и приложение winform. . Этот класс на самом деле просто носитель данных. Опять же, это зависит от степени интеграции с вашими доменными классами и nhibernate, а также от того, насколько сложны ваши классы: некоторые структуры данных не могут быть сериализованы по умолчанию.

  • Эта модель может не соответствовать тому, что вы уже сделали с вашим приложением

3
ответ дан 7 December 2019 в 01:16
поделиться

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

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

Что бы вы ни делали, вы не можете передать имя пользователя / пароль привилегированного пользователя ненадежному лицу. Это просто напрашивается на неприятности. Независимо от того, насколько хорошо вы пытаетесь скрыть свои учетные данные в зашифрованной строке внутри двоичного файла или еще чего-то, всегда есть способ узнать их. Конечно, сделает ли кто-нибудь это на самом деле, зависит от того, насколько интересны ваши данные, но молча надеяться, что люди с отладчиками просто оставят вас в покое, - не очень хорошая мера безопасности.

5
ответ дан 7 December 2019 в 01:16
поделиться

Я думаю, что это сложно сделать: это как если бы вы не хотели, чтобы пользователь stackoverflow знал свой пароль. Пользователь всегда может отследить свой сетевой трафик и увидеть пользователя / пароль (у вас может быть кодировка, но я все равно не уверен на 100%).

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

1
ответ дан 7 December 2019 в 01:16
поделиться

Вот почему настольные приложения для баз данных - отстой. Нет хорошего способа разрезать это. Лучше всего использовать хранимые процедуры или веб-службы. По сути, это еще один уровень, который можно заблокировать и контролировать доступ к базе данных.

1
ответ дан 7 December 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: