Подобный, но не то же:
Привет все, у меня есть приложение C# WinForms, соединяющееся с сервером базы данных. Строка соединения с базой данных, включая основного пользователя / передача, помещается в конфигурационный файл NHibernate, который находится в том же каталоге как EXE-файл.
Теперь у меня есть эта проблема: пользователь, который запускает приложение, не должен узнавать имя пользователя/пароль общего пользователя базы данных, потому что я не хочу, чтобы он рылся вокруг в базе данных непосредственно.
Кроме того, я мог hardcode строка подключения, которая плоха, потому что администратор должен смочь изменить его, если база данных перемещена или если он хочет переключиться между dev/test/prod средами.
Так долго я находил три возможности:
На первый вопрос, на который ссылаются, обычно отвечали путем создания файла только читаемым для пользователя, который запускает приложение.
Но это не находится недостаточно в моем случае (пользователь, запускающий приложение, является человеком. База данных, user/pass, является общей и не должна даже быть доступной человеком.)
Первый ответ дополнительно предложил зашифровать данные о соединении прежде, чем записать это в файл.
С этим подходом администратор не может больше настроить строку подключения, потому что он не может зашифровать его вручную.
Второй вопрос, на который ссылаются, обеспечивает подход для этого самого сценария, но это кажется очень сложным.
Мои вопросы Вам:
Это - очень общий вопрос, так нет ли никакой общий "how-to-do-it" путь, так или иначе "шаблон разработки"?
Есть ли в инфраструктуре конфигурации.NET некоторая поддержка?
(дополнительный, возможно, из объема), я могу объединить это легко с механизмом конфигурации NHibernate?
Обновление:
В ответ на первые ответы: существует несколько причин, почему я хотел бы соединиться с базой данных непосредственно и не использовать веб-сервис:
У Вас есть дальнейшие идеи, принимая это во внимание?
На самом деле подход 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();
}
}
}
}
есть некоторые вещи, на которые вы должны обратить внимание:
IList
должен быть преобразован в List
или что-то подобное NHibernate.Criterions.Order
), вы, вероятно, не найдете проблем. Фактически у вас может быть столько же .asmx
в вашем веб-сервисе по своему усмотрению, возможно, даже «сопоставьте» их с соответствующими dao (например, публичный класс FooService: WebService
, публичный класс BarService: WebService
, ] открытый класс CheService: WebService
, где каждый соответствует DAO). http: //server/FWS/FooService.asmx
В приведенном выше примере я возвращаю Bar []
с Bar
, отображаемым с помощью nhibernate. Чаще всего это может быть не так, и вам может потребоваться написать вспомогательный класс WSBar
, где он адаптирует исходный класс Bar
к тому, что может потреблять веб-сервис и приложение winform. . Этот класс на самом деле просто носитель данных. Опять же, это зависит от степени интеграции с вашими доменными классами и nhibernate, а также от того, насколько сложны ваши классы: некоторые структуры данных не могут быть сериализованы по умолчанию.
Эта модель может не соответствовать тому, что вы уже сделали с вашим приложением
Прежде всего, разрешив ненадежным пользователям подключаться в базу данных, как правило, не лучшая идея. Так много всего может пойти не так. Поместите веб-сервис между ними.
Если вам абсолютно необходимо это сделать, сделайте так, чтобы это не имело значения, даже если они получат имя пользователя и пароль. Ограничьте их права в базе данных, чтобы они могли выполнять только несколько хранимых процедур со встроенными проверками безопасности.
Что бы вы ни делали, вы не можете передать имя пользователя / пароль привилегированного пользователя ненадежному лицу. Это просто напрашивается на неприятности. Независимо от того, насколько хорошо вы пытаетесь скрыть свои учетные данные в зашифрованной строке внутри двоичного файла или еще чего-то, всегда есть способ узнать их. Конечно, сделает ли кто-нибудь это на самом деле, зависит от того, насколько интересны ваши данные, но молча надеяться, что люди с отладчиками просто оставят вас в покое, - не очень хорошая мера безопасности.
Я думаю, что это сложно сделать: это как если бы вы не хотели, чтобы пользователь stackoverflow знал свой пароль. Пользователь всегда может отследить свой сетевой трафик и увидеть пользователя / пароль (у вас может быть кодировка, но я все равно не уверен на 100%).
Я думаю, вам следует добавить веб-сервис между вашим пользователем и вашей базой данных с уникальным идентификатором для каждого пользователя.
Вот почему настольные приложения для баз данных - отстой. Нет хорошего способа разрезать это. Лучше всего использовать хранимые процедуры или веб-службы. По сути, это еще один уровень, который можно заблокировать и контролировать доступ к базе данных.