ASP.NET连接字符串部署最佳实践

5

我已经收集了一份(希望有用的)总结,介绍了我研究过的实现本文主题的方法,以及我对它们的问题。如果您发现其他更好的方法,特别是解决我提到的方法无法解决的问题的方法,请告诉我。

  1. 将连接字符串留在web.config中,并使用XDT/msdeploy转换根据我的活动构建配置(例如,web.PublicTest.config文件)替换它们的设置。我的问题是我将一些特定于服务器的设置合并并深埋到一个其他全局相同但有许多配置元素的文件中。此外,我不能在多个对等级别的应用程序之间共享连接字符串定义。

  2. 在web.config中指定configSource="DeveloperLocalConnectionStrings.config"值,然后将此值进行XDT转换以指向代码库中多个环境特定文件之一。我的问题是我将所有环境的密码发送到所有目标位置(当然还包括SVN),并且在服务器上有未使用的配置部分等待被意外使用。

  3. 将连接字符串指定为machine.config文件而不是web.config。问题:谁会想在machine.config中找到连接字符串,因此结果可能会产生意外名称冲突。

  4. 指定configSource="LocalConnectionStrings.config",不要转换该值,并编辑项目xml以排除连接字符串配置的部署。 http://msdn.microsoft.com/en-us/library/ee942158.aspx#can_i_exclude_specific_files_or_folders_from_deployment-这是我发现来满足我需要专有(非分布式)Web应用程序的最佳解决方案,但是我很怕另一个团队成员某天会复制生产站点以测试某些原因,那么Voila!生产数据库现在正在UAT期间被修改。(更新:我发现在这种情况下无法使用一键发布,只能使用带有-skip参数的msdeploy命令行。如上所述排除文件与将其设置为"None"编译操作相同,导致软件包从部署目标中删除它。)

  5. 将部署包连接到提示连接字符串(如果尚未设置,则不知道如何执行此操作,但我知道它是可能的)。这将产生与上面#4类似的结果。

  6. 指定configSource="..\ConnectionStrings.config"。对于我的需求来说真的很棒,因为我可以在我选择的应用程序之间共享配置,并且在我的应用程序目录中没有任何特定于机器的内容。不幸的是,在此属性中不允许父路径(就像对于'appSettings file=""'一样-还要注意您可以在configSource=引用中漂亮地使用file=)。

p.s. 这些解决方案的一些讨论在这里:ASP.Net配置文件 -> 多个开发者和部署服务器的连接字符串

3个回答

3
使用 SQL Server 时,您还可以使用集成安全性/SSPI,并将 WebServer 计算机登录添加到 Sql Server。这样,您无需在 web.config 中公开任何内容,并且可以向该登录授予角色,就像向任何其他数据库用户一样。
不过,您必须了解所采取的影响和安全考虑,因为作为该计算机执行的任何恶意代码都将访问 Sql Server。
此致 Ole

太棒了,谢谢Ole。 Eglasius简要提到了“集成”,但没有提到添加登录。请注意,对于不共享域的服务器,存在限制。您可以保存远程服务器密码,但不能用于MSSQL文件流类型列,并且还有其他限制。 - Shannon

1
  1. 使用主机名作为连接字符串的键,这样可以自动选择数据源。确保选择程序没有错误(更改主机名-测试!)...

  2. 不要将其放在web.config中,编写一个ini文件,这样就没有XML编码。

  3. 使用私钥/公钥(RSA/PGP)加密密码。永远不要使用明文或对称密钥,后者同样糟糕。


我喜欢它 - 虽然你会笑,但目前测试和开发应用程序池在同一台IIS服务器上运行。 - Shannon
  1. 请问你能澄清一下吗?这个ini文件可以从同一个库方法中使用吗?具体来说,我有一个Entity Framework格式的连接字符串。
- Shannon
谢谢,我不知道我可以在连接字符串中使用非对称密钥或加密连接字符串(无论你指的是哪一个)。我会研究一下如何实现这个功能。 - Shannon
@Shannon:不行。你必须使用Read/Write PrivateProfileString pinvokes,或者编写自己的ini序列化程序。优点是如果它是一个XML字符串,你可以手动更改它,但是在XML文件中这样做意味着你需要知道所有这些转义序列,而在ini文件中则根本不需要转义序列。 - Stefan Steiger
感谢您的跟进,Quandry,我明白了。 - Shannon

0

请查看我的博客文章:保护asp.net机器密钥和连接字符串

如果您使用Quandary的答案,请使用不在站点文件夹中的密钥,就像asp.net对受保护的配置部分所做的那样。

我们手动批准进入暂存/生产环境的web.config更改。我们尽可能使用集成而不是基于用户名,但在后一种情况下,我们使用的选项是在SVN中只有用户名/密码的占位符。

我们过去使用单独的配置文件,但我们遇到了其他类型的web.config修改问题,因此最近我们一直将其锁定在单个文件中。


谢谢Eglasius。我喜欢集成安全性的想法。这曾经是我的工作方式,但我不记得为什么停止了。正如我们所有人经历过的那样,每个人类交互点都是等待发生故障的停机时间。 - Shannon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接