将Azure KeyVault注入ASP.NET网站的最佳方法?

将Azure KeyVault注入ASP.NET网站的最佳方法?,asp.net,azure-pipelines,azure-keyvault,web-site-project,Asp.net,Azure Pipelines,Azure Keyvault,Web Site Project,我继承了一个旧的项目前风格的ASP.NET网站(在这里您只打开一个文件夹,没有解决方案文件)。我能够将其转换为稍新的ASP.NET网站模板,因此现在我有了解决方案文件。(在那之后,我确实试图转换成一个Web应用程序,但它变得非常糟糕——似乎需要重新编写,除非我搞砸了,这总是可能的) 我们正在迁移此应用程序,以便通过Azure DevOps管道进行部署,我对如何处理机密(特别是连接字符串)有点困惑。我们已经为其他应用程序设置了密钥库,而且一切都很好,但网站模板并没有像Web应用程序模板那样进行良好

我继承了一个旧的项目前风格的ASP.NET网站(在这里您只打开一个文件夹,没有解决方案文件)。我能够将其转换为稍新的ASP.NET网站模板,因此现在我有了解决方案文件。(在那之后,我确实试图转换成一个Web应用程序,但它变得非常糟糕——似乎需要重新编写,除非我搞砸了,这总是可能的)

我们正在迁移此应用程序,以便通过Azure DevOps管道进行部署,我对如何处理机密(特别是连接字符串)有点困惑。我们已经为其他应用程序设置了密钥库,而且一切都很好,但网站模板并没有像Web应用程序模板那样进行良好的集成

现在,我可以在web配置中放置占位符,并使用管道将值替换为Key Vault,这将很好地工作,但是本地开发将不是很容易(我想他们每次都必须复制/粘贴本地web配置)

有人在这个网站上成功地做到了这一点,或者我只是想用一种从未为之着迷的老技术来做点什么


谢谢

尽管Replace-token方法在Azure devops管道中非常方便且易于使用,但正如您所提到的,它给其他开发人员的工作(尤其是本地开发人员)带来了很多麻烦

为什么不考虑使用任务来完成这项工作呢?此任务有一个功能变量替换可以避免对配置文件进行任何格式更改。只需定义将替换到配置文件中的相应变量


让我举一个示例来解释这一点,下面是一个简单的
web.config
文件示例:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="apiConfig" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
  <apiConfig>
    <add key="ClientBasetUrl" value="http://localhost:4200" />
  </apiConfig>
  <system.web>
    <compilation debug="true" targetFramework="4.6.2">
      <assemblies>
        <add assembly="System.Net.Http.WebRequest, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
      </assemblies>
    </compilation>
    <httpRuntime targetFramework="4.6.1" maxRequestLength="20480" />
  </system.web>
</configuration>
然后,您将看到此任务结束后替换成功完成

您可以看到,我不需要对配置文件进行任何语法更改,只需要将相应的变量存储在Azure key vault中,并确保它们可以在管道运行期间下载


此外,它还可以让我在本地开发工作中非常顺利。

虽然替换令牌方法在Azure devops管道中非常方便且易于使用,但正如您所提到的,它给其他开发人员的工作(尤其是本地开发)带来了许多麻烦

为什么不考虑使用任务来完成这项工作呢?此任务有一个功能变量替换可以避免对配置文件进行任何格式更改。只需定义将替换到配置文件中的相应变量


让我举一个示例来解释这一点,下面是一个简单的
web.config
文件示例:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="apiConfig" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
  <apiConfig>
    <add key="ClientBasetUrl" value="http://localhost:4200" />
  </apiConfig>
  <system.web>
    <compilation debug="true" targetFramework="4.6.2">
      <assemblies>
        <add assembly="System.Net.Http.WebRequest, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
      </assemblies>
    </compilation>
    <httpRuntime targetFramework="4.6.1" maxRequestLength="20480" />
  </system.web>
</configuration>
然后,您将看到此任务结束后替换成功完成

您可以看到,我不需要对配置文件进行任何语法更改,只需要将相应的变量存储在Azure key vault中,并确保它们可以在管道运行期间下载


而且,这可以让我在本地的开发工作非常顺利。

这太棒了!所以无论在哪里,它都将用直接名称匹配替换任何内容?因此,如果我有一个名为ClientBaseUrl和一个名为SqlConnectionString的,只要keyvault有“ClientBaseUrl”和“SqlConnectionString”,它就会替换它们?@Hershizer33。对只需将键名指定为变量,此任务将自动替换其值。你可以试一下,我有一个问题。我在
IISWebAppDeploymentOnMachineGroup@0
,除了在末尾添加了一个额外的报价外,它工作得非常好。就像keyvault是foo,值是“string”一样,生成的文件如下所示:
我不知道额外的单引号来自何处。(我仔细检查了keyvault没有额外的报价)请在有机会时查看这个问题:这太棒了!所以无论在哪里,它都将用直接名称匹配替换任何内容?因此,如果我有一个名为ClientBaseUrl和一个名为SqlConnectionString的,只要keyvault有“ClientBaseUrl”和“SqlConnectionString”,它就会替换它们?@Hershizer33。对只需将键名指定为变量,此任务将自动替换其值。你可以试一下,我有一个问题。我在
IISWebAppDeploymentOnMachineGroup@0
,除了在末尾添加了一个额外的报价外,它工作得非常好。就像keyvault是foo,值是“string”一样,生成的文件如下所示:
我不知道额外的单引号来自何处。(我仔细检查了keyvault没有额外报价)请在有机会时查看此问题: