如何使用用户分配的托管标识访问 Azure 中 Function App Config 的 Key Vault

Posted

技术标签:

【中文标题】如何使用用户分配的托管标识访问 Azure 中 Function App Config 的 Key Vault【英文标题】:How to use user-assigned managed identity to access Key Vault for Function App Config in Azure 【发布时间】:2021-11-20 01:54:46 【问题描述】:

我在 Azure 中为我的一个函数应用设置了 KeyVault 配置。使用这样的 Startup 类非常简单:

using Azure.Identity;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
using System.IO;
using Core.Utility;

[assembly: FunctionsStartup(typeof(MyJob.Startup))]
namespace MyJob

class Startup : FunctionsStartup

    private IConfiguration _configuration;

    public override void Configure(IFunctionsHostBuilder builder)
    
        // Configure your services here.
    

    public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
    
        var context = builder.GetContext();
        var configurationBuilder = builder.ConfigurationBuilder;
        configurationBuilder.AddJsonFile(Path.Combine(context.ApplicationRootPath, "appsettings.json"), true, false)
            .AddEnvironmentVariables();

        // Add the Key Vault:
        var configuration = configurationBuilder.Build();
        configurationBuilder.AddAzureKeyVault(KeyVaultSecrets.MakeKvUri(configuration["KeyVaultName"]),
            new DefaultAzureCredential());
        _configuration = configurationBuilder.Build();
    


我现在想使用用户分配的托管身份而不是系统分配的身份,这样我就不必为我创建的每个新应用或部署槽授予对 KV 的访问权限。

我已阅读此文档:https://docs.microsoft.com/en-us/azure/app-service/overview-managed-identity?tabs=dotnet,但这显示了在您自己的代码中创建的 KV 客户端的示例,并且基础架构正在此处为我创建客户端。

如何更改才能使用用户分配的身份?

【问题讨论】:

由于您不想仅基于密钥保管库访问来使用系统托管标识,如果您要将 KV 访问更改为 RBAC(而不是默认访问策略)并使用 AD 组怎么办具有“Key Vault Secrets User”角色,只需在创建时使用基础架构即代码将每个应用程序和插槽添加到组中? 我为 KV 尝试了 RBAC,它实际上比手动将应用程序身份添加到每个 KV 更烦人和麻烦,因为你不能只为应用程序身份分配角色,你必须去分别进入每个 KV 并允许访问。 IE - RBAC 并没有让 IMO 变得更容易。 【参考方案1】:

要将DefaultAzureCredential 与用户分配的托管标识一起使用,请将AZURE_CLIENT_ID 环境变量设置为标识的客户端ID。

通过GitHub Issue找到

【讨论】:

【参考方案2】:

要让用户分配的身份生效,您只需更改

new DefaultAzureCredential()

new ManagedIdentityCredential(<Client ID>)

当您在 Azure 门户中查看用户分配的标识时,客户端 ID 会显示在该标识上。

如果有一种方法可以通过配置将 DefaultAzureCredential 重定向到用户分配的身份,那就太好了,因为这样您必须在代码中放置一些东西,以便在默认凭据和托管身份之间切换基于是否附加了调试器或配置项,这样您就可以在不使用该身份的情况下进行本地调试,因为从 VS 调试时使用默认凭据仍然是正确的。

我确实尝试将此添加到 Azure 中的配置中,但没有成功(默认凭据无法使用用户分配的身份)。

AzureServicesAuthConnectionString: RunAs=App;AppId=<client id>

【讨论】:

以上是关于如何使用用户分配的托管标识访问 Azure 中 Function App Config 的 Key Vault的主要内容,如果未能解决你的问题,请参考以下文章

使用自动化帐户中用户分配的托管标识连接到 Azure 存储帐户(使用 Azure RM 模块)

如何获取Azure App Service的特定用户分配的托管服务标识的令牌?

如果用户是用户分配托管标识,则确定 Azure SQL Server 中的用户名

如何将 Azure 托管标识分配给 Azure 存储帐户?

具有用户分配的托管标识的 Azure SQL 数据库连接池

通过托管标识通过 Synapse 访问 Azure 存储帐户