VM上的Azure Key Vault访问引发OAuth异常:必须提供ClientId选项

时间:2020-05-10 20:04:37

标签: c# azure asp.net-core-mvc azure-keyvault

我试图将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>();
            });

有什么想法吗?谢谢!

3 个答案:

答案 0 :(得分:0)

可能有2处出错。

  1. 其中一个位于您的appsetting.json或appsetting.production.json中(如果您要覆盖的话)应该具有正确的值,如下所述 { “ keyVaultEnvironmentConfigName”:“您的密钥库名称” } 注意:如果您在本地运行,除非您已在AD中注册了localhost URL,否则它将无法正常工作。因为在Azure门户中您已经配置了WebAPP URL,所以在本地运行对于相同的clientid无效。
  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();
        }
    }