我正在考虑构建一次Click-Once应用程序,并试图围绕如何处理整个连接字符串问题。问题如下:
我想使用EF直接从每个客户端获取数据,因此要求每个客户端配置一个连接字符串(这不是问题)。如何处理与正在查询的SQL Server不在同一域中的客户端?换句话说,如果我试图从家里运行我的应用程序而不是工作,我的连接字符串应该是什么样的?我是否需要以不同的方式配置我的SQL Server以允许这种情况?
提前致谢!
答案 0 :(得分:3)
这个问题超越了ClickOnce,这是一个普遍的网络问题。
第一个问题是:您可以在家中访问SQL Server吗?
如果SQL Server位于公司内部网络上,则很可能答案是“否”。您需要设置VPN才能到达服务器。如果您设置了VPN,那么只要您完全限定服务器名称,即SqlServer.mycompany.local
而不仅仅是SqlServer
,您应该能够在家中使用相同的连接字符串。您可能会使用域凭据连接到VPN,因此您可以使用相同的连接字符串。
但更好的方法是使用诸如WCF Data Services之类的包装器。这将通过Web服务(WCF)公开数据并为您提供许多功能 - 您可以针对它和所有内容编写Linq。从长远来看,如果您希望远程使用该应用程序,这可能会更容易使用。
在我们的例子中,我们实际上有业务服务 - 一个相当大的API,它通过Web服务提供业务逻辑,而不是仅仅包装数据库表(如果你愿意,可以称之为SOA)。从超长期来看,这是最佳选项,因为它抽象了逻辑API而不是数据库,但如果您正在寻找快速修复,WCF数据服务可能是通往去。
答案 1 :(得分:1)
您打算如何对家庭用户进行身份验证?在域中,您可以使用集成身份验证检查用户帐户权限,以便连接字符串本身不包含凭据。对于域外的用户,我认为这不可行。
我认为您需要将您的数据库包装在Web服务之后,Web服务支持基于非域的身份验证方案。远程用户访问的不是数据库。
答案 2 :(得分:0)
使用SQL身份验证。这将跨域工作。
答案 3 :(得分:0)
虽然SQL身份验证可行,但您需要为SQL服务器上的每个应用程序用户设置不同的用户/密码组合。不是理想的或易于维护的情况。
您最好的选择是根本不连接数据库。而是构建一个应用程序调用以获取其数据的安全Web服务。然后可以通过Windows或用户名/密码auth(可以针对AD域验证)来保护该Web服务。
答案 4 :(得分:0)
如果SQL Server可以在同一主机名上路由,无论客户端在哪里(即您的家,客户办公室) - 我猜你已经设置了某种VPN或DMZ,因此您的SQL服务器可以访问在你的办公楼之外 - 那么你可以把你的应用程序中的连接字符串保留得很好并使用SQL身份验证(用户名/密码与Windows身份验证相对应。)
如果你的SQL服务器需要一个不同的连接字符串(例如在工作时它在sql.internal.domain.com
访问,在sql.external.domain.com
之外工作)那么你将需要某种选择机制来用户可以在登录前选择要使用的连接 - 在应用程序中包含所有可能的连接字符串。
你也可以做一些时髦的事情,例如使用IP地址来确定使用哪个连接字符串(例如,如果当前的PC IP地址在172.40.10.1 - 172.40.10.254范围内),然后连接到sql.internal.domain.com
,否则sql.external.domain.com
。当然,这更难以维持。
修改强>:
正如其他人所建议的那样,网络服务也可以在这里支付股息。