【发布时间】:2011-03-02 10:58:06
【问题描述】:
我知道这里已经有很多关于这个主题的问题(我已经阅读了尽可能多的内容),但我还没有弄清楚如何最好地满足我的特定标准。以下是目标:
ASP.NET 应用程序将在几个不同的 Web 服务器上运行,包括用于开发的 localhost 工作站。
这意味着使用机器密钥加密 web.config 已失效。Web 服务器的每个“类型”或环境(dev、test、prod)都有自己对应的数据库(dev、test、prod)。我们希望将这些连接字符串分开,以便在“dev”代码上工作的开发人员无法看到任何“prod”连接字符串密码,也不允许这些生产密码被部署到错误的服务器或提交给 SVN。应用程序
将应该能够根据服务器名称(使用 switch 语句)决定尝试使用哪个连接字符串。例如,“localhost”和“dev.example.com”将应该知道使用 DevDatabaseConnectionString,“test.example.com”将使用 TestDatabaseConnectionString,“www.example.com”将例如,使用 ProdDatabaseConnectionString。这样做的原因是为了限制发生任何部署事故的机会,即错误类型的 Web 服务器连接到错误的数据库。理想情况下,完全相同的可执行文件和 web.config 应该能够在任何这些环境中运行,而无需在每次部署时单独定制或配置每个环境(这似乎很容易在部署期间忘记/搞砸了一天,这就是为什么我们不再只有一个必须在每个目标上更改的连接字符串)。目前通过 FTP 完成部署。 更新:使用“构建事件”并修改我们的部署程序可能不是一个坏主意。
我们将无法通过命令行访问生产 Web 服务器。这意味着使用 aspnet_regiis.exe 加密 web.config 已失效。更新:我们可以通过编程方式执行此操作,因此这一点没有实际意义。我们希望不必在密码更改时重新编译应用程序,因此使用 web.config(或 db.config 或其他)似乎最有意义。
开发人员应该无法获取生产数据库密码。如果开发人员将源代码检查到他们的 localhost 笔记本电脑上(这将确定它应该使用 DevDatabaseConnectionString,记得吗?)并且笔记本电脑丢失或被盗,则应该无法获取其他连接字符串。因此,不能考虑使用单个 RSA 私钥来解密所有三个密码。 (与上面的#3相反,如果我们走这条路,我们似乎需要三个单独的密钥文件;这些可以在每台机器上安装一次,如果错误的密钥文件部署到错误的服务器,最糟糕的情况是应该发生的是应用程序无法解密任何内容——并且不允许错误的主机访问错误的数据库!)
更新/附录:该应用程序有几个独立的面向 Web 的组件:一个经典的 ASMX Web 服务项目、一个 ASPX Web 窗体应用程序和一个较新的 MVC 应用程序。为了不让在每个单独的项目中为每个单独的环境配置相同的连接字符串而发疯,最好只出现在一个地方。 (可能在我们的 DAL 类库或单个链接的配置文件中。)
我知道这可能是一个主观问题(要求以“最佳”方式做某事),但鉴于我提到的标准,我希望确实会出现一个最佳答案。
谢谢!
【问题讨论】:
标签: asp.net security encryption web-config