虚拟机上的Azure密钥保管库访问引发OAuth异常:必须提供ClientId选项



我正在尝试将Azure密钥保管库访问添加到运行在Azure虚拟机上的.Net Core应用程序。我觉得这应该是一个简单的场景,但当应用程序启动时,我遇到了麻烦。似乎有什么配置不正确,或者我使用了错误的依赖项。

虚拟机在Azure中运行,系统分配了托管标识,并且它可以获取/列出对密钥保管库的访问权限。该应用程序是一个.Net核心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>();
});

有什么想法吗?谢谢

可能有两件事出了问题。

  1. 一个在您的appsetting.json或appsetting.production.json中(如果您正在重写(应该具有如下所述的正确值{"keyVaultEnvironmentConfigName":"您的密钥保管库名称"}注意:如果您在本地运行,除非您在AD中注册了localhost url,否则它不会工作。因为在Azure门户中,您已为WebAPP url进行了配置,因此本地运行将无法用于相同的客户端ID
  2. 如果上述配置密钥的名称和值正确,则托管标识配置不正确

注意:如上所述,如果您在本地环境中运行,请确保在Azure AD中添加localhost url或在DevMode中绕过KeyVault。

服务主体是否有权访问Azure密钥库?在创建服务主体时,您还需要创建可以从Azure AD应用程序创建的客户端机密。此客户端机密用于身份验证。

我发现了问题所在。密钥保管库访问确实有效,但Startup.cs文件中的配置无法访问。我在Startup.cs文件中设置了几个OAuth提供程序,第一个配置的是设置ClientId。这就是我犯错误的原因。

我附加了我的启动功能和我需要做的更改,以使一切正常工作。我注意到我必须在Program.cs文件和Startup.cs文件中都有Azure密钥保管库配置,否则不同的东西在应用程序的不同点上无法工作。

原始启动。启动功能。也许这里有一个问题使密钥库值无法访问?

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();
}
}

最新更新