chi*_*oro 7 c# database nhibernate connection-string app-config
相似但不一样:
大家好,我有一个C#WinForms应用程序连接到数据库服务器.数据库连接字符串(包括通用用户/传递)放在NHibernate配置文件中,该文件与exe文件位于同一目录中.
现在我遇到了这个问题:运行应用程序的用户不应该知道普通数据库用户的用户名/密码,因为我不希望他直接在数据库中搜索.
或者,我可以硬编码连接字符串,这是不好的,因为管理员必须能够在移动数据库时更改它,或者如果他想在dev/test/prod环境之间切换.
很久以来我发现了三种可能性:
通常通过使文件仅对运行应用程序的用户可读来回答第一个引用的问题.
但在我的情况下这还不够(运行应用程序的用户是一个人.数据库用户/通行证是一般的,甚至不应该被人访问.)
第一个答案还建议在将连接数据写入文件之前加密连接数据.
使用这种方法,管理员不再能够配置连接字符串,因为他无法手动加密.
在第二个引用的问题提供了这种非常情况下的做法,但似乎很复杂.
我向你提问:
这是一个非常普遍的问题,所以没有任何一般的"怎么做"的方式,不知何故是一种"设计模式"?
.NET的配置基础架构是否有一些支持?
(可选,可能超出范围)我可以轻松地将其与NHibernate配置机制结合起来吗?
更新:
回答第一个答案:有几个原因我想直接连接到数据库而不使用Web服务:
您是否有任何进一步的想法考虑到这一点?
首先,让不受信任的用户连接到数据库通常不是一个好主意.很多事情都可能出错.在中间放置一个Web服务.
如果您必须这样做,请将其设置为即使获得用户名和密码也无关紧要.限制它们在数据库中的权限,以便它们只能执行一些具有内置安全检查的存储过程.
无论您做什么,都不能将特权用户的用户名/密码提供给不受信任的人.这只是在寻找麻烦.无论你试图在二进制文件或其他内容中的加密字符串中隐藏凭证,总有办法找到它们.当然,是否有人真正做到这一点取决于你的数据有多有趣,但是默默地希望那些带有调试器的人只会让你一个人不是一个非常好的安全措施.
实际上,WebService 方法(在其他答案中提到)意味着您将 NHibernate 及其逻辑移至 Web 服务。然后,WebService 使用 WebService 的方法向应用程序公开可用的数据库功能。
数据库实际上只有一个用户,即 WebService 使用的用户,如果您希望应用程序用户具有不同的数据库权限,则可以从 WebService 层抽象它
最后,WinForms 应用程序只知道 WebService 的位置,它通过 WebService 的方法请求数据,您可以在这两个端点之间应用任何所需的安全措施。
对于离线功能,一切都归结为采用一种安全的方式将数据持久保存到本地存储并通过 WebService 提供同步方法
实际上,我已经使用与数据库通信的 Web 服务和仅与 Web 服务通信的 WinForm 应用程序(.NET Compact Framework)来完成此操作,并且在没有蜂窝网络覆盖的情况下,它会将更改序列化到存储卡(数据是不重要,所以对于我的情况来说,未采取模糊/淫秽的安全措施)
根据要求更新一个小例子(尽管要求提供一个例子,我确实觉得很奇怪)
您已经在 ASP.NET WebService 应用程序类型的项目中设置了域类和 nhibernate 配置以及(例如)存储库内容。为了简单起见,我只会有一个 Web 服务类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[]
}
}
Run Code Online (Sandbox Code Playgroud)
我们抽象了 daobehaviour,或者直接使用 nhsession,暴露为 webmethod。
现在,在 WinForm 应用程序中,您需要做的就是Add a WebReference对配置进行所有必要的更改,同时生成所有必要的类(在本示例中,它将Bar在 Web 服务公开时创建一个类)。
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();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
有一些事情你必须注意:
IList<Bar>必须转换为List<Bar>或类似的内容NHibernate.Criterions.Order),你可能会发现没有问题。事实上,您可以.asmx在 Web 服务中拥有任意数量的类,甚至可以将它们“映射”到相应的 dao(例如public class FooService : WebService, public class BarService : WebService,public class CheService : WebService其中每个类对应一个 DAO)。http://server/FWS/FooService.asmx在上面的示例中,我返回一个Bar[]与Barnhibernate 映射的值。通常情况并非如此,您可能需要编写一个辅助类,WSBar使原始Bar类适应 Web 服务和 winform 应用程序可以使用的内容。这个类实际上只是一个数据载体。同样,这取决于您的域类和 nhibernate 的集成程度以及您的类的 muxh 复杂程度:默认情况下某些数据结构无法序列化。
该模型可能不适合您已经对应用程序所做的操作
| 归档时间: |
|
| 查看次数: |
2263 次 |
| 最近记录: |