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

ASP.NET连接字符串部署最佳实践,asp.net,deployment,web-config,connection-string,msdeploy,Asp.net,Deployment,Web Config,Connection String,Msdeploy,我收集了一份(希望有用的)总结,总结了我为完成这篇文章的主题而研究的方法,以及我在这些方法上遇到的问题。请告诉我你是否找到了其他你更喜欢的方法,特别是如果它们解决了我提到的方法没有解决的问题 将连接字符串保留在web.config中,并使用XDT/msdeploy转换将其替换为符合我的活动生成配置(例如,web.PublicTest.config文件)的设置。我的问题是,我将一些特定于服务器的设置合并到一个具有许多配置元素的全局相同的文件中。此外,我不能在多个对等级应用程序之间共享连接字符串定义

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

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

  • 为web.config中的连接字符串指定configSource=“DeveloperLocalConnectionStrings.config”值,XDT将该值转换为指向代码库中多个特定于环境的文件之一。我的问题是,我将所有环境的密码发送到所有目的地(当然还有SVN),并且服务器上有未使用的配置部分等待意外使用

  • machine.config文件而不是web.config文件中的特定连接字符串。问题:到底是谁希望在machine.config中找到连接字符串,结果导致意外名称冲突的概率很高

  • 指定configSource=“LocalConnectionStrings.config”,不要转换该值,并编辑项目xml以排除连接字符串config的部署。-这是我找到的最好的解决方案,可以满足我对专有(非分布式)web应用程序的需求,但我担心有一天另一个团队成员会出于某种原因来复制生产站点进行测试,瞧!生产数据库现在正在UAT期间进行修改。(更新:我发现在这种情况下不能使用一键发布,只有带有-skip参数的msdeploy命令行。排除上述文件与将其设置为“无”编译操作而不是“内容”相同,并导致包将其从部署目标中删除。)

  • 如果尚未设置连接字符串,请将部署包连接起来,以提示输入连接字符串(我不知道如何进行设置,但我知道这是可能的)。这将产生与上述第4条类似的结果

  • 指定configSource=“..\ConnectionString.config”。这对我的需求来说是非常好的,因为我可以在我选择的应用程序之间共享配置,并且在我的应用程序目录中没有特定于机器的内容。不幸的是,此属性中不允许父路径(与“appSettings file=”“”类似-请注意,您也可以在configSource=引用中使用file=)

  • p、 这里讨论了其中一些解决方案:

  • 使用主机名作为connectionstring的键,这样您可以自动选择数据源。确保选择例程没有错误(更改主机名-测试!)

  • 不要把它放在web.config中,编写一个ini文件,这样就没有XML编码

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


  • 查看我的以下博文:

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

    我们手动批准进入暂存/生产的web.config更改。在可能的情况下,我们使用集成的而不是基于用户名的,但是我们在后面的例子中使用的一个选项是在SVN中为用户名/密码设置占位符


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

    使用SQL Server时,您还可以使用集成安全/SSPI并将web Server计算机登录添加到SQL Server

    这样,您就不必公开web.config中的任何内容,您可以像授予任何其他DB用户一样授予该登录的角色

    尽管您必须了解要采取的措施和安全注意事项,因为在该机器上执行的任何恶意代码都可以访问Sql Server

    关于
    Ole

    1。我喜欢它——尽管你会笑,但目前测试和开发应用程序池运行在同一台IIS服务器上。请你澄清一下好吗?可以从相同的库方法使用此ini文件吗?具体来说,我有一个实体框架格式的连接字符串。谢谢,我不知道我可以在连接字符串中使用非对称密钥或加密连接字符串(无论您是什么意思)。我会研究更多关于这是如何做到的。@Shannon:不,不能。您必须使用读/写PrivateProfileString pinvokes,或者编写自己的ini序列化程序。优点是您可以手动更改它,如果它是XML字符串,则必须对引号之类的内容进行编码。在XML文件中手动执行这项操作意味着您需要了解所有这些转义序列,在ini文件中执行这项操作根本不需要转义序列。感谢后续的Quandry,我理解。感谢Eglasius。我喜欢综合安全的想法。它曾经是我的MO,我不记得我为什么停下来了。正如我们都经历过的,人类互动的每一点都是等待发生的。太棒了,谢谢。Eglasius简单地提到了“集成”,但没有提到添加登录。请注意,对不共享域的服务器有限制。您可以保存远程服务器密码,但该密码不能用于MSSQL filestream类型的列,并且还有其他限制。