最佳实践:将 WPF 连接到远程 SQL 数据库
Posted
技术标签:
【中文标题】最佳实践:将 WPF 连接到远程 SQL 数据库【英文标题】:Best practice: Connect WPF to remote SQL database 【发布时间】:2017-06-24 17:37:26 【问题描述】:我知道关于这个主题有很多问题,但是经过四天的阅读和谷歌搜索后,我有点卡住了,需要有人为我澄清一些事情。
我的情况:
我用 C# 开发了一个 WPF 应用程序。 此应用程序需要连接到数据库,因为它存储用户帐户数据和其他数据。到目前为止,我通过设置数据源并使用 Fluent NHibernate 进行映射和会话,在 Visual Studio 环境中使用本地数据库。 现在我想通过 ClickOnce 将应用程序分发给用户,所以我需要从本地数据库切换到在线数据库。
我有一个 Web 服务器(Debian 8 Jessie 64 位,内核版本 3.16.0-4-amd64 (SMP)),通过 SSH 访问和访问 i-MSCP 1.3.16 平台来管理服务器。我在服务器的一个域和一个 sql-user 中创建了一个数据库,我可以访问 phpmyadmin。
我已按照步骤授予任何 IP 的远程访问权限,例如 SANDHYALAL KUMAR 所描述的 here。
第一个问题:如何检查现在是否成功授予远程访问权限。因为在执行mysql> GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'%' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION;
时,我通过 Putty 控制台得到了0 rows affected.
?
第二个也是更重要的问题:我现在如何将我的 WPF 连接到我的服务器。 我读过,我不应该直接连接到服务器,因为密码安全和数据库安全,像这样:
ISessionFactory sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2012
.ConnectionString(c => c
.Server("SSS")
.Database("DDD")
.Username("UUU")
.Password("PPP")
).ShowSql()
)
.Mappings(m =>
m.FluentMappings
.AddFromAssemblyOf<User>())
.ExposeConfiguration(cfg => new SchemaExport(cfg)
.Create(false, false))
.BuildSessionFactory();
return sessionFactory.OpenSession();
但是,我认为上述解决方案不适合我,因为我没有在线 MSSQL Server,对吧?还是我需要配置我现有的服务器?
是否有特定的层或 API 可以解决我的问题。 WCF、REST 或 ADO.Net 对我来说是一个解决方案吗?我真的被所有这些不同的名字所困扰,所以我真的很感谢你对我的两个问题的一些解释和建议。
【问题讨论】:
明确一点...您要分发 WPF 桌面应用程序...连接到在线数据库...同时保护连接字符串? 是的,这不常见吗?我的意思是每个应用程序都以某种方式连接到数据库,不是吗?关于安全性,我认为 WPF 和数据库之间的层可以解决问题。 确实,如果这是您的场景,您需要公开一个 API(最简单的是使用 WebApi 项目),您的客户端将连接到该 API。 API 将安全地与数据库通信。所以:客户端 --> API --> DB 感谢您的澄清,您能推荐一个特定的 webAPI 或框架来设置这样的 api 吗? 【参考方案1】:您的情况与我的情况几乎相同。 我的应用程序也是 WPF (clickonce) 并连接到 Microsoft Azure Cloud SQL Server。 我也挣扎了好几天,因为如您所知,安全始终是最重要的。
在桌面应用程序和分发中输入密码意味着向黑客提供密码。就像您评论的那样,使用 WCF 设置一个层并让 WCF 保存非对称(如 RSA)编码的密码。然后,服务器将仅使用非对称密钥对用户进行身份验证以进行解密。此私钥仅存在于服务器中。
回答第一个问题)您可以编写一个 SELECT 查询来确认哪些登录、用户具有这些角色、是否启用访问权限。 我确信互联网上很多地方都有有用的例子。
希望这有助于您的理解..
【讨论】:
您知道 WCF 是否适用于我描述的服务器吗?我没有 SQL Server,我在 debian 服务器上运行 mysql 数据库。而且我听说WCF很难设置。我没有网络服务方面的经验。那么,WCF 是否适合“仅”建立连接? 现在是东亚的早晨。我发现 Debian 服务器 + MySQL 案例在我们国家也很常见。您的服务器将具有 IP 地址(或域),并且您的 WPF 应用程序将通过 WCF 等通信代理进行连接。我不知道内部服务器,因为我使用的是云服务器,但你可以在互联网上找到许多 WCF+ MySQL 文章和问题。作为 WCF(Window Communication Foundation)的名称,它针对通信进行了优化,与您的知识水平相比,设置起来并不困难。 制作 WCF 很容易,而且可以很小,但是你想与服务器通信的 SQL 命令越多,WCF 中需要的合同、接口代码就越多。 Contracts、Intercfaces 之类的所有术语你可能不熟悉,但一旦学会,它们就什么都不是了。然而,对我来说,最困难的地狱是理解安全性。花了几个月的时间才完成。一开始,我什至不确定这种架构是否可用。 WCF 本身真的不难。如您所知,安检是您必须通过的一扇门,可能需要一些时间。 非常感谢您提供的详细信息。然后我将进入 WCF,很高兴知道这是正确的方法,然后在错误的方向工作几天或几周,然后遇到任何兼容性问题或类似问题。顺便说一句,我的服务器也是云服务器。安全始终是一个障碍,但也很重要。以上是关于最佳实践:将 WPF 连接到远程 SQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章
使用 NodeJS 将 Angular2 项目连接到 SpringBoot (Java) 的最佳实践
将 MS Access 连接到网络上的 SQL Server