我试图在.NET 4.7.1 MVC应用程序中使用新的AzureKeyVault ConfigurationBuilder,并在本地运行时不断出现配置错误:
Configuration Error
Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately.
Parser Error Message: An error occurred loading a configuration file: One or more errors occurred.
Source Error:
Line 13: </builders>
Line 14: </configBuilders>
Line 15: <appSettings configBuilders="AzureKeyVault">
Line 16: <add key="webpages:Version" value="3.0.0.0" />
Line 17: <add key="webpages:Enabled" value="false" />
创建新的.NET Framework 4.7.1 ASP.NET MVC Web项目后,我向Azure Key Vault添加了已连接的服务,并定位了现有的Vault。然后,我的web.config看起来包括以下部分:
<configuration>
<configSections>
<section name="configBuilders" type="System.Configuration.ConfigurationBuildersSection, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" restartOnExternalChanges="false" requirePermission="false" />
</configSections>
<configBuilders>
<builders>
<add name="AzureKeyVault" vaultName="my-test-keyvault" connectionString="" type="Microsoft.Configuration.ConfigurationBuilders.AzureKeyVaultConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Azure, Version=1.0.0.0, Culture=neutral" vaultUri="https://WebApplication1-12-kv.vault.azure.net" />
</builders>
</configBuilders>
<appSettings configBuilders="AzureKeyVault">
<add key="webpages:Version" value="3.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.7.1" />
<httpRuntime targetFramework="4.7.1" />
我一直在搜寻互联网,试图找到connectionString应该是什么样子的示例,但是我没有取得任何成功。该文档指出:
vaultName是必需的。其他属性使您可以手动控制要连接到哪个保管库,但是只有在应用程序不在与Microsoft.Azure.Services.AppAuthentication完美结合的环境中运行时,才需要使用这些属性。 Azure服务身份验证库用于在可能的情况下自动从执行环境中获取连接信息,但是您可以通过提供连接字符串来替代该功能。
这里有任何建议或指示吗?谢谢。
答案 0 :(得分:1)
链接文章(Announcing .NET 4.7.1 Tools for the Cloud)中链接的文档已过期。 AzureKeyVaultConfigBuilder类上没有 clientId 和 clientSecret 属性。
但是有一个 connectionString 属性。本文在Service-to-service authentication to Azure Key Vault using .NET中提供了有关在本地运行时如何构建该连接字符串的详细信息。
这是对我有用的方法:
RunAs=App;AppId={AppId};TenantId={TenantId};AppKey={ClientSecret}
这三个值(AppId,TenantId和AppKey)在Azure的应用程序的AD条目中均可用。
答案 1 :(得分:0)
我可以使用以下代码在本地重现您的问题:
<add name="AzureKeyVault"
mode="Strict"
vaultName="MyVaultName"
type="Microsoft.Configuration.ConfigurationBuilders.AzureKeyVaultConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Azure" />
如果您的应用程序在具有的Azure服务上运行,那么您只需从Vault中读取配置并将其添加到您的应用程序即可。相反,如果您不在带有MSI的服务上运行,则仍可以通过添加以下属性来使用保管库:
clientId –可以访问您的密钥保险库的Azure Active Directory应用程序密钥。
clientSecret –与clientId对应的Azure Active Directory应用程序密码
我使用以下代码进行测试,并且效果很好,您可以参考它。
<configSections>
<section name="configBuilders" type="System.Configuration.ConfigurationBuildersSection, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" restartOnExternalChanges="false" requirePermission="false" />
</configSections>
<configBuilders>
<builders>
<add name="KeyVault" mode="Strict" prefix="conn_" stripPrefix="true"
clientId="MyId" clientSecret="mySecret" vaultName="MyVault"
type="Microsoft.Configuration.ConfigurationBuilders.AzureKeyVaultConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Azure" />
</builders>
</configBuilders>
有关更多详细信息,您可以参考此article。