将 Azure 托管标识用于部署到 Azure 的应用程序?
Posted
技术标签:
【中文标题】将 Azure 托管标识用于部署到 Azure 的应用程序?【英文标题】:Using Azure Managed Identity for app deployed to Azure? 【发布时间】:2022-01-09 22:59:55 【问题描述】:我有一个将部署到 azure 的 azure 函数应用。在这个应用程序中,我有一些秘密存储在 Key Vault 中,我需要使用 Azure Managed Identity。我的一个类中有以下方法可以检索存储在 KeyVault 上的机密。
public static string GetSecretValue(string secretkey)
string keyVaultName = Environment.GetEnvironmentVariable("KEY_VAULT_NAME");
var kvUri = "https://" + keyVaultName + ".vault.azure.net";
var secretclient = new SecretClient(new Uri(kvUri), new DefaultAzureCredential());
return secretclient.GetSecret(secretkey).Value.Value;
我有一个环境变量,用于存储我的 Key Vault 名称,如代码所示。我需要检查我的步骤是否正确,以便在生产/部署到 Azure 期间使用 Azure Managed Identity 检索存储在 KeyVault 中的 5 个机密的值,并确保一切正常(请注意,在本地运行时一切正常)。
到目前为止,我所做的如下:
1- 为 Azure Function App 启用托管标识
2- 授予 Azure Function 访问 KeyVault 的权限(选择它作为用户主体)
3- 根据上述方法在 Visual Studio 中配置 Azure Key Vault
我的问题是为了使用 Azure Managed Identities,我是否在上面的代码或步骤中遗漏了某些内容?我应该在 Azure 上的应用程序设置中添加任何其他内容还是不需要添加?我可以保持环境变量的显示方式还是应该将其存储在 Azure 上的其他位置?
【问题讨论】:
如果它在本地正常工作,这意味着您的代码或多或少是正确的(因为DefaultAzureCredential
将使用浏览器登录来获取凭据,并且您提到它可以工作)。您能否将屏幕截图粘贴到您的问题中,详细说明您分配给托管身份的主体的权限?此外,您可能希望使用 Application Insights 或其他一些记录器记录该值,以便查看那里是否存在有效值?
【参考方案1】:
我已经在我的环境中测试过。
您需要为每个秘密添加应用程序设置,其值如下:
@Microsoft.KeyVault(SecretUri=https://my-key-vault.vault.azure.net/secrets/secretName/secretVersion)
您可以从当前版本秘密的秘密标识符中找到秘密Uri:
我使用下面的代码行调用了这个秘密:
var secretValue = Environment.GetEnvironmentVariable("secret1", EnvironmentVariableTarget.Process);
我能够成功获取密钥库机密
【讨论】:
非常感谢您的帮助。这真的很有帮助。我只是有一个小问题。在我的情况下,Visual Studio 中的代码既可以设置为发布模式,也可以在配置管理器中进行调试。我如何知道它将以哪种模式发布到 Azure? 你可以在这里看到你以什么模式发布你的函数从 vs > build > 发布选择:i.imgur.com/Ll4Q9XW.png 非常感谢。我接受了你的回答。最后一个问题,正如您在上面的方法中看到的那样,我在本地存储了一个名为 KEY_VAULT_NAME 的环境变量。发布时我应该删除该环境变量吗?还是我应该保留它?如果我应该删除它,我将如何在应用程序发布时根据上述方法检索秘密的值?如果该应用程序已发布并且我想在本地再次对其进行修改,我将如何做到这一点?如果它重新发布,它是如何完成的?非常感谢您的帮助:) 您可以在本地保留/更改环境变量,因为它不会影响 azure 函数应用中的 KeyVault 操作。以上是关于将 Azure 托管标识用于部署到 Azure 的应用程序?的主要内容,如果未能解决你的问题,请参考以下文章
使用托管标识与 Azure SQL 的 EF Core 连接