Azure基于托管标识的访问控制配置及相关问题咨询
Azure托管标识配置相关问题解答
已完成操作及前置疑问
- 创建托管标识,其访问控制(IAM)角色分配包含拥有参与者/所有者角色的用户,需确认:托管标识是否是指向用户/角色集合的间接指针,权限由配置位置赋予?
- 在应用服务「标识 | 用户分配」中添加该托管标识(用于访问数据库和密钥保管库),询问是否无需系统分配标识?
- 在SQL服务器「标识」中添加该托管标识并设为主要标识,询问是否同样无需系统分配标识?
问题1:应用服务和SQL数据库已分配同一托管标识,是否需要遵循官方文档的所有步骤?是否有简单连接字符串直接使用共享托管标识?
- 核心步骤不能省略:必须为托管标识在SQL服务器IAM中分配对应的数据访问角色(比如
SQL DB Contributor),同时在数据库内创建该托管标识的登录名和用户,并赋予所需的数据库权限,这是身份认证和授权的基础。 - 连接字符串无需包含凭据,直接使用以下格式即可:
应用会通过Server=tcp:{server-name}.database.windows.net,1433;Database={db-name};Authentication=Active Directory Managed Identity;DefaultAzureCredential自动使用已绑定的用户分配托管标识完成认证。
问题2:密钥保管库无「标识」菜单,如何通过访问控制(IAM)授权带该托管标识的应用服务读取密钥保管库?
按以下步骤操作:
- 进入目标密钥保管库的**访问控制(IAM)**页面;
- 点击「添加角色分配」,在角色列表中选择
密钥保管库机密用户(仅需读取机密权限时),或根据需求选择更合适的角色; - 在「分配访问权限至」选项中选择「托管标识」,点击「选择成员」;
- 在弹出的列表中找到你创建的用户分配托管标识,选中后完成角色分配即可。
问题3:在Blazor服务器应用的Program.cs中添加以下代码是否正确?
原代码:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((context, config) => { if (context.HostingEnvironment.IsProduction()) { var builtConfig = config.Build(); var secretClient = new SecretClient( new Uri($"https://{builtConfig["KeyVaultName"]}.vault.azure.net/"), new DefaultAzureCredential()); config.AddAzureKeyVault(secretClient, new KeyVaultSecretManager()); } }) .ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>());
- 核心逻辑是正确的,能实现生产环境从密钥保管库加载配置的需求。
- 可优化点:不需要手动实例化
SecretClient,AddAzureKeyVault支持直接传入URI和DefaultAzureCredential,简化后代码如下:public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((context, config) => { if (context.HostingEnvironment.IsProduction()) { var builtConfig = config.Build(); config.AddAzureKeyVault( new Uri($"https://{builtConfig["KeyVaultName"]}.vault.azure.net/"), new DefaultAzureCredential()); } }) .ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>()); - 额外建议:生产环境中添加异常处理逻辑,避免因密钥保管库不可用导致应用启动失败。
问题4:仅添加上述代码后,密钥保管库中的配置是否会覆盖应用服务配置及appsettings.json中的内容?
是的,配置加载优先级为:appsettings.json < 应用服务配置 < 密钥保管库配置。添加AddAzureKeyVault后,密钥保管库中的同名机密会自动覆盖之前加载的配置项。如果需要调整优先级,可以通过调整ConfigurationBuilder中配置源的加载顺序来实现。
内容的提问来源于stack exchange,提问作者David Thielen
相关产品推荐
相关产品推荐

