我试图将Azure Key Vault访问权限添加到在Azure中的VM上运行的.Net Core应用程序。我觉得这应该是一个简单的场景,但是在应用启动时我遇到了麻烦。似乎某些东西配置不正确,或者我使用了错误的依赖项。
VM在Azure中运行,并为其分配了系统管理的身份,并且具有对密钥库的获取/列表访问权限。该应用程序是.Net core 3 MVC应用程序,我正在尝试从密钥库中加载配置。
应用程序启动时,“应用程序窗口日志”中将显示一系列三个错误。它们都看起来像:
System.ArgumentException: The 'ClientId' option must be provided. (Parameter 'ClientId')
at Microsoft.AspNetCore.Authentication.OAuth.OAuthOptions.Validate()
at Microsoft.AspNetCore.Authentication.RemoteAuthenticationOptions.Validate(String scheme)
at Microsoft.AspNetCore.Authentication.AuthenticationBuilder.<>c__DisplayClass4_0'2.<AddSchemeHelper>b__1(TOptions o)
我在代码中尝试了一些不同的操作,但是仍然遇到相同的错误。该文件位于Program.cs文件中,为了简洁起见,我删除了环境检查。
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
var builtConfig = config.Build();
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(
new KeyVaultClient.AuthenticationCallback(
azureServiceTokenProvider.KeyVaultTokenCallback));
config.AddAzureKeyVault(
$"https://{builtConfig[keyVaultEnvironmentConfigName]}.vault.azure.net/",
keyVaultClient,
new DefaultKeyVaultSecretManager());
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
有什么想法吗?谢谢!
答案 0 :(得分:0)
可能有2处出错。
注意:如上所述,如果您在本地环境上运行,请确保将本地主机URL添加到Azure AD中或绕过DevMode中的KeyVault。
答案 1 :(得分:0)
服务负责人是否有权访问Azure Key Vault?在创建服务主体时,您还需要创建可以从Azure AD应用程序创建的客户端机密。该客户端机密用于身份验证。
答案 2 :(得分:0)
我弄清楚了我的问题所在。密钥库访问实际上是有效的,但是无法在Startup.cs文件中访问配置。我在Startup.cs文件中设置了几个OAuth提供程序,正在配置的第一个是设置ClientId。这就是我遇到特定错误的原因。
我附加了启动功能和所做的更改,以使所有功能正常运行。我注意到,我必须在Program.cs文件和Startup.cs文件中都具有Azure Key Vault配置,否则在应用程序的不同位置上无法进行其他操作。
原始启动。启动功能。也许这里存在一个问题,无法访问密钥保管箱值?
public Startup(IWebHostEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile("devsecrets.json", optional: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
固定的启动功能:
public Startup(IWebHostEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile("devsecrets.json", optional: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
// logic to set useKeyVault has been omitted
if (useKeyVault)
{
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(
new KeyVaultClient.AuthenticationCallback(
azureServiceTokenProvider.KeyVaultTokenCallback));
builder.AddAzureKeyVault(
$"https://{Configuration[keyVaultEnvironmentConfigName]}.vault.azure.net/",
keyVaultClient,
new DefaultKeyVaultSecretManager());
Configuration = builder.Build();
}
}