【问题标题】:Best way to inject Azure KeyVault into a ASP.NET Web Site?将 Azure KeyVault 注入 ASP.NET 网站的最佳方式?
【发布时间】:2020-04-29 19:23:08
【问题描述】:

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

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

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

有人用网站成功地做到了这一点,还是我只是想用一种从未适应过的旧技术来做一些事情?

谢谢!

【问题讨论】:

    标签: asp.net azure-pipelines azure-keyvault web-site-project


    【解决方案1】:

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

    为什么不考虑使用File transformation 任务来完成这项转换工作?这个任务有一个特性变量替换可以让你避免对配置文件的任何格式更改。只需要定义相应的变量,这些变量将替换到配置文件中。


    让我举一个例子来解释一下,下面是一个简单的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>
    

    现在我需要将 ClientBasetUrl 值:http://localhost:4200 替换为 http://localhost:8080

    1) 既然你关心的是将 Azure Key Vault 与 Asp.net Web 应用程序结合起来,那就去创建一个秘密ClientBasetUrl 到 Azure key Vault 中,它的值为http://localhost:8080

    2) 将 Azure 密钥保管库连接到 azure devops 管道。

    3) 这里是关键步骤:配置File Transform task

    steps:
    
    - task: FileTransform@2
    
      displayName: 'File Transform with Variable: '
    
      inputs:
    
        folderPath: '$(System.DefaultWorkingDirectory)'
    
        xmlTargetFiles: MonoApp.config //Here put your config file name that relative to the root folder
    

    然后您将看到此任务结束后替换成功完成。

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

    另外,它可以让我在本地开发工作上非常顺利。

    【讨论】:

    • 这太棒了!所以无论它在哪里,它都会用直接名称匹配替换任何东西?因此,如果我有一个名为 ClientBaseUrl 的 和一个名为 SqlConnectionString 的 ,只要 keyvault 具有“ClientBaseUrl”和“SqlConnectionString”,它就会替换它们?
    • @Hershizer33。是的!只需将键名指定为变量,然后此任务将自动替换其值。你可以试试看
    • 我有一个问题。我在IISWebAppDeploymentOnMachineGroup@0 上使用了内置的xmlVariableSubstitution 选项,它工作得很好,除了它在末尾添加了一个额外的单引号。就像 keyvault 是 foo 并且 value 是“string”一样,生成的文件看起来像这样:&lt;add name="foo" connectionString="string'"/&gt; 我不知道那个额外的单引号是从哪里来的。 (我确实仔细检查过 keyvault 没有额外的引号)
    • 有机会请看这个问题:stackoverflow.com/questions/61775700/…
    猜你喜欢
    • 1970-01-01
    • 2011-12-05
    • 2012-10-22
    • 2011-09-20
    • 1970-01-01
    • 2011-06-14
    • 2010-09-26
    • 2011-02-23
    • 1970-01-01
    相关资源
    最近更新 更多