如何获取web.config转换以包含外部机密文件?

时间:2018-07-27 09:56:42

标签: asp.net visual-studio iis web-config web.config-transform

是否有一种方法可以在Visual Studio 2015+中获取web.config转换,以包含外部引用的机密文件的内容,如here所述?

这在本地开发时效果很好,并且不在源代码管理中包含文件,但是当我打算将Web应用程序部署到服务器时,我希望它包含它连接的另一个Web服务的用户名和密码至。如果我在服务器上的IIS中手动输入设置,则每次发布应用程序时这些设置都会丢失。

如果我在我的web.config文件中省略了appSettings块中的键(以便仅在密钥文件中引用它们),则每当我发布该应用程序时,服务器上IIS中手动输入的设置都会被完全删除。

为了更好的安全性,能够引用外部文件中的某些内容,并且不签入源代码管理的密码并不是一个好主意,恕我直言,因为我的部署现在是一场噩梦。每次部署后,我都不想在服务器上的web.config文件中手动输入密码。

我也不希望加密,因为我必须对部署到的每个服务器都进行加密,以便将相关的机器密钥用于每个web.config文件。

我只是最近才考虑从源代码管理中删除此密码,以响应最近为改进工作中的安全性实践而做出的努力(我很理解并同意),但是我也可以理解为什么对安全性的考虑如此差,因为如果没有可用的工具,那么普通开发人员的生活将变得非常不愉快。

肯定有一种不求助于加密的方法吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

按照您链接到的Microsoft Docs示例,将此XDT转换放入Web.Release.config中应该可以解决问题:

<appSettings file="..\..\AppSettingsSecrets.config" xdt:Transform="SetAttributes">
    <add key="mailAccount" xdt:Locator="Match(key)" xdt:Transform="Remove" />
    <add key="mailPassword" xdt:Locator="Match(key)" xdt:Transform="Remove" />
    <add key="TwilioSid" xdt:Locator="Match(key)" xdt:Transform="Remove" />
    <add key="TwilioToken" xdt:Locator="Match(key)" xdt:Transform="Remove" />
    <add key="TwilioFromPhone" xdt:Locator="Match(key)" xdt:Transform="Remove" />
    <add key="GoogClientID" xdt:Locator="Match(key)" xdt:Transform="Remove" />
    <add key="GoogClientSecret" xdt:Locator="Match(key)" xdt:Transform="Remove" />
</appSettings>

您不需要xdt:Locator元素本身的<appSettings>属性,因为只有一个appSettings。

编辑:我误解了原始问题。目标是包括引用文件的内容,这是使用XDT无法实现的。必须有另一种方式。

答案 1 :(得分:0)

没有CI系统,我认为您最好的选择可能是执行脚本之前/之后的构建操作?

我建议您将实际值替换为敏感的web.config值的标记(某些值唯一/容易找到,例如MY_PRODUCT_DATABASE_PASSWORD等)。然后可以将您的web.config安全地检查到源代码管理中。

在VS中,您可以添加构建操作以运行自定义的powershell或exe,以便在正常压缩和部署之前基本上对具有实际值的令牌执行查找和替换。

实际值的实际存储方式/位置以及脚本的工作方式完全取决于您。您可以根据vs或从web.config本身中的数据(甚至嵌入为web.config中的注释)传递给脚本/ exe的数据,轻松地在部署计算机上或某个数据库的行中找到文件。

有关vs可用变量的详细信息,您可以在构建操作中将它们传递给exe或脚本:https://msdn.microsoft.com/en-us/library/42x5kfw4.aspx

您想使用PowerShell,您可以将值读取/替换/写入web.config(或任何文本文件),例如:How can I replace every occurrence of a String in a file with PowerShell?