部署于本地服务器的控制台应用能否使用Azure Managed Identity?
结论先行
原生Azure托管标识(Managed Identities)本身仅支持绑定到Azure云上的资源,不能直接给非Azure托管的本地服务器上的应用使用,但有两种成熟的可落地方案可以实现完全一致的效果,完全满足你从本地应用访问Key Vault机密的需求。
方案1:通过Azure Arc启用本地服务器的托管标识(最接近原生托管标识的体验)
该方案将本地服务器接入Azure Arc成为受Azure管理的Arc资源,直接支持绑定托管标识,使用体验和云内托管标识完全一致:
- 第一步:将你的本地服务器接入Azure Arc,按照流程完成Arc Agent安装和资源注册,注册完成后本地服务器会在Azure Portal中作为
Azure Arc 服务器资源存在 - 第二步:给该Arc服务器分配用户分配托管标识(或系统分配托管标识,可按需选择)
- 第三步:在Key Vault的访问策略(或RBAC权限配置)中,给该托管标识授予
密钥保管库机密用户权限,确保其拥有机密读取权限 - 第四步:你的控制台应用直接使用Azure SDK内置的托管标识相关方法获取令牌访问Key Vault即可,和云内应用的写法完全一致,C#示例代码如下:
using Azure.Identity; using Azure.Security.KeyVault.Secrets; var client = new SecretClient( new Uri("https://<你的密钥保管库名称>.vault.azure.cn/"), new ManagedIdentityCredential("<用户分配托管标识的客户端ID>") ); KeyVaultSecret secret = client.GetSecret("<待读取的机密名称>");
- 方案优势:不需要在本地维护任何应用凭据,和云内托管标识的安全模型、使用逻辑完全对齐,适合有多台本地服务器需要访问Azure资源的场景。
方案2:使用Azure AD应用服务主体(轻量方案,无需接入Azure Arc)
如果不想改动本地服务器的注册配置,可以直接使用Azure AD服务主体身份访问Key Vault,安全级别同样满足生产要求:
- 第一步:在Azure Portal中注册一个Azure AD应用,生成该应用的客户端密钥(优先配置证书认证,安全性更高)
- 第二步:在Key Vault的访问策略中给该Azure AD应用授予
密钥保管库机密用户权限 - 第三步:把应用的客户端ID、租户ID、凭据(密钥/证书)安全存储在本地服务器的加密存储中(比如Windows凭据管理器、Linux密钥环),禁止硬编码在代码或配置文件里
- 第四步:使用Azure SDK的对应凭据类获取令牌访问Key Vault,客户端密钥认证的C#示例代码如下:
using Azure.Identity; using Azure.Security.KeyVault.Secrets; var credential = new ClientSecretCredential( tenantId: "<你的AAD租户ID>", clientId: "<注册的AAD应用客户端ID>", clientSecret: "<本地存储的客户端密钥>" ); var client = new SecretClient( new Uri("https://<你的密钥保管库名称>.vault.azure.cn/"), credential ); KeyVaultSecret secret = client.GetSecret("<待读取的机密名称>");
- 方案优势:无需改动本地服务器配置,部署快速灵活,适合单台服务器或者少量应用的场景。
注意事项
- 两种方案都需要确保本地服务器可以正常访问Azure对应端点,如果有网络限制可以配置Key Vault的防火墙规则,放行本地服务器的公网出口IP
- 生产环境优先选择证书认证而非密钥认证,降低凭据泄露风险
- 禁止将任何凭据硬编码在代码、配置文件或代码仓库中
内容的提问来源于stack exchange,提问作者Jack Johns
相关产品推荐
相关产品推荐

