首页 > 解决方案 > 将 azure keyvault 机密 json 反序列化为 MicrosoftIdentityOptions

问题描述

我在应用程序启动时加载 keyvault 机密,并且配置添加了保管库机密 ,正如我们在此处看到的那样。我正在使用 Microsoft.Identity.Web 添加 AD SSO 并注册 AddSignin(),如示例中所述。但是这个秘密并没有像预期那样被序列化。但是,如果秘密保存在 appsettings.json 中,它可以正常工作。我怎样才能使这项工作?需要显式反序列化吗?

请在下面找到整个代码设置

1.Program.cs 有以下代码。

ConfigureAppConfiguration((hostingCtx, config) =>
        {

            if (hostingCtx.HostingEnvironment.IsProduction())
            {
                var builtConfig = config.Build();
                AzureKeyVaultConfigurationExtensions.AddAzureKeyVault(config, builtConfig["AppConfiguration:KeyVaultUrl"]);
            }
        })
  1. 以下 json 格式的秘密存储在 keyvault 中
{"CallbackPath":"/home/index","ClientId":"######","ClientSecret":"#######","Domain":"######","Instance":"######","TenantId":"######"}
  1. 添加了对 Microsoft.Identity.Web 的引用

  2. 在 Startup.cs->ConfigureService 中注册了以下服务

    services.AddAuthentication(sharedOptions =>
                {
                    sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                    sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
                })
                .AddSignIn("AzureAd1", configuration, options => configuration.Bind("AzureAd1", options));
  1. 在应用程序引导上,以下变量microsoftIdentityOptions 为空

文件 - WebAppServiceCollectionExtensions.cs

public static AuthenticationBuilder AddSignIn(
                this AuthenticationBuilder builder,
                string configSectionName,
                IConfiguration configuration,
                string openIdConnectScheme,
                string cookieScheme,
                Action<OpenIdConnectOptions> configureOptions,
                bool subscribeToOpenIdConnectMiddlewareDiagnosticsEvents = false)
            {
                builder.Services.Configure(openIdConnectScheme, configureOptions);
                builder.Services.Configure<MicrosoftIdentityOptions>(options => configuration.Bind(configSectionName, options));

                var microsoftIdentityOptions = configuration.GetSection(configSectionName).Get<MicrosoftIdentityOptions>();
     .......
     ......
    }

任何帮助深表感谢。

谢谢

标签: c#single-sign-onazure-keyvaultmsalmicrosoft-identity-platform

解决方案


答案就在这里https://docs.microsoft.com/en-us/aspnet/core/security/key-vault-configuration?view=aspnetcore-2.2#bind-an-array-to-a-class

在密钥保管库中创建密钥作为名称-值对。

Azure Key Vault 机密名称仅限于字母数字字符和短划线。分层值(配置部分)使用 --(两个破折号)作为分隔符。冒号通常用于在 ASP.NET Core 配置中从子项中分隔部分,但不允许在密钥保管库机密名称中使用。因此,当秘密加载到应用程序的配置中时,使用两个破折号并用冒号交换。

与其将所有秘密保存在单个 json 中,不如将每个属性添加为单个秘密。

例如,“AzureAd1--TenantId”应该是 AzureAd1 表示部分的键的名称


推荐阅读