如何使用用户分配的托管标识为Azure Function App配置Key Vault访问
修改方案
你只需要调整DefaultAzureCredential的初始化参数,指定提前创建好的用户分配托管标识的客户端ID即可,具体操作如下:
前置准备
- 在Azure门户创建用户分配托管标识,为其授予Key Vault的对应访问权限(一般分配
机密读取权限即可满足配置读取需求) - 将该用户分配托管标识绑定到你的函数应用所有需要访问Key Vault的部署槽位
- 在函数应用的应用配置(或项目的appsettings.json)中新增配置项
UserAssignedManagedIdentityClientId,值为你创建的用户分配托管标识的客户端ID
代码修改
仅需要调整ConfigureAppConfiguration方法中Key Vault相关的初始化逻辑,给DefaultAzureCredential传入指定了托管标识ID的参数即可,修改后完整代码如下:
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) { // 此处继续配置你的其他服务 } 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(); // 添加Key Vault配置 var configuration = configurationBuilder.Build(); // 指定用户分配托管标识的客户端ID var credentialOptions = new DefaultAzureCredentialOptions { ManagedIdentityClientId = configuration["UserAssignedManagedIdentityClientId"] }; configurationBuilder.AddAzureKeyVault( KeyVaultSecrets.MakeKvUri(configuration["KeyVaultName"]), new DefaultAzureCredential(credentialOptions) ); _configuration = configurationBuilder.Build(); } } }
额外说明
- 本地开发调试时,
DefaultAzureCredential会自动匹配你本地IDE、Azure CLI等工具登录的Azure账号,只要该账号拥有Key Vault的访问权限,无需额外修改代码即可正常调试 - 部署到Azure环境后,运行时会自动使用你指定的用户分配托管身份访问Key Vault,新增函数或部署槽位时仅需绑定同一个用户分配托管标识即可,无需重复授权Key Vault访问权限
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

