最佳实践:将 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) 的最佳实践

连接 WPF 和 SQL Server 的最佳实践

将 MS Access 连接到网络上的 SQL Server

使用excel连接到远程sql数据库

将 .NET Core 桌面应用程序连接到 Azure SQL Server 的最佳方式是啥

将 spark 应用程序连接到远程 sql 服务器时出现 jdbc 连接超时错误