【问题标题】:ASP.NET connection string deployment best practiceASP.NET 连接字符串部署最佳实践
【发布时间】:2010-10-15 07:35:37
【问题描述】:

我收集了一份(希望有用的)总结,总结了我为完成这篇文章的主题而进行的研究,以及我遇到的问题。请告诉我您是否找到了您更喜欢的其他方法,尤其是如果它们解决了我提到的方法无法解决的问题。

  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 应用程序需求的最佳解决方案,但我很怀疑另一位团队成员有一天会出于某种原因复制生产站点进行测试,瞧!现在正在 UAT 期间修改生产数据库。 (更新:我发现在这种情况下我不能使用一键发布,只能使用带有 -skip 参数的 msdeploy 命令行。如上排除文件与将其设置为“无”编译操作而不是“内容”,并导致包将其从部署目标中删除。)

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

  6. 指定一个 configSource=".​​.\ConnectionStrings.config"。非常适合我的需求,因为我可以在我选择的应用程序之间共享配置,并且我的应用程序目录中不会有任何特定于机器的内容。不幸的是,此属性中不允许使用父路径(就像它们用于 'appSettings file=""' - 另请注意,您可以在 configSource= 引用中大量使用 file=)。

附言这里讨论了其中一些解决方案:ASP.Net configuration file -> Connection strings for multiple developers and deployment servers

【问题讨论】:

    标签: asp.net deployment web-config connection-string msdeploy


    【解决方案1】:

    使用 SQL Server 时,还可以使用 Integrated Security / SSPI 并将 WebServer 计算机登录添加到 Sql Server。

    这样您就不必在 web.config 中公开任何内容,并且可以像授予任何其他数据库用户一样向该登录名授予角色。

    尽管您必须了解其中的含义和要采取的安全注意事项,因为任何作为该机器执行的恶意代码都可以访问 Sql Server。

    关于 奥莱

    【讨论】:

    • 太棒了,谢谢 Ole。 Eglasius 简要提到了“集成”,但没有提到添加登录。请注意,对不共享域的服务器有限制。您可以保存远程服务器密码,但不能用于 MSSQL 文件流类型列,并且还有其他限制。
    【解决方案2】:
    1. 使用主机名作为连接字符串的键,这样您就可以自动选择数据源。确保选择例程没有错误(更改主机名 - 测试!)...

    2. 不要放在web.config里,写个ini文件,这样就没有XML编码了。

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

    【讨论】:

    • 1.我喜欢它——虽然你会笑,但目前测试和开发应用程序池运行在同一个 IIS 服务器上。
    • 2.你能澄清一下吗?这个ini文件可以从同一个库方法中使用吗?具体来说,我有一个实体框架格式的连接字符串。
    • 3.谢谢,我不知道我可以在连接字符串中使用非对称密钥或加密连接字符串(无论您是什么意思)。我会进行研究以了解更多关于它是如何完成的。
    • @Shannon:不,它不能。您必须使用 Read/Write PrivateProfileString pinvokes,或编写您自己的 ini 序列化程序。优点是可以手动更改,如果是 XML 字符串,则必须对引号之类的内容进行编码。在 XML 文件中手动执行此操作意味着您需要知道所有这些转义序列,在 ini 文件中执行此操作根本不需要转义序列。
    • 感谢Quandry的跟进,我明白了。
    【解决方案3】:

    查看我的以下博文:Protecting asp.net machine keys and connection strings

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

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

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

    【讨论】:

    • 感谢 Eglasius。我喜欢集成安全性的想法。它曾经是我的 MO,我不记得我为什么停下来了。正如我们都经历过的那样,人机交互的每一点都是等待发生的停机时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 2017-09-07
    • 2010-10-11
    • 2014-04-01
    • 2017-12-01
    • 1970-01-01
    • 2020-04-17
    相关资源
    最近更新 更多