如何向用户分配的身份授予对 Key Vault 的访问权限?

vas*_*rgu 3 azure azure-active-directory azure-keyvault

是否可以向用户分配的身份授予对 Key Vault 的访问权限?

在 azure 门户的 Managed Identities 中,我创建了一个新的身份“KeyVaultIdentity”,我将其分配给了一个 Web 应用程序(在身份中,用户分配的身份选项卡)。在来自密钥保管库的访问策略中,我添加了新创建的“KeyVaultIdentity”身份并提供了访问机密的权限。

我正在使用以下代码访问密钥保管库:

try
        {
            /* The below 4 lines of code shows you how to use AppAuthentication library to fetch secrets from your Key Vault*/
            AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
            KeyVaultClient keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
            var secret = await keyVaultClient.GetSecretAsync("https://play9VaultDemo.vault.azure.net/secrets/AppSecret")
                .ConfigureAwait(false);
            Message = secret.Value;

            /* The below do while logic is to handle throttling errors thrown by Azure Key Vault. It shows how to do exponential backoff which is the recommended client side throttling*/
            do
            {
                long waitTime = Math.Min(getWaitTime(retries), 2000000);
                secret = await keyVaultClient.GetSecretAsync("https://play9VaultDemo.vault.azure.net/secrets/AppSecret")
                    .ConfigureAwait(false);
                retry = false;
            }
            while (retry && (retries++ < 10));
        }
        /// <exception cref="KeyVaultErrorException">
        /// Thrown when the operation returned an invalid status code
        /// </exception>
        catch (KeyVaultErrorException keyVaultException)
        {
            Message = keyVaultException.Message;
            if ((int)keyVaultException.Response.StatusCode == 429)
                retry = true;
        }
Run Code Online (Sandbox Code Playgroud)

但是它说当我尝试访问机密时禁止访问。但是,如果在 Key Vault 中我授予访问 Web 应用程序的系统分配标识的权限,则我可以访问该机密,

您知道如何使用用户分配的身份进行这项工作吗?

小智 8

我遇到了同样的问题,每次尝试使用用户分配的身份访问 KeyVault 时,我都必须做两件事来逐步“禁止”:

  1. 将我使用的 Microsoft.Azure.Services.AppAuthentication 版本升级到 1.2.0-preview2。早期版本不支持用户分配的身份。

  2. 将连接字符串传递到 AzureServiceTokenProvider 构造函数以告知服务使用哪个标识。这是上面所有链接都忽略的一点。所以我有:

    var connectionString = "RunAs=App;AppId=";
    var azureServiceTokenProvider = new AzureServiceTokenProvider(connectionString);

代替:

var azureServiceTokenProvider = new AzureServiceTokenProvider();
Run Code Online (Sandbox Code Playgroud)

若要查找 clientId 的值,请在 Azure 门户中打开托管标识。您应该会看到一个标记为“客户端 ID”的字段。这就是你想要的。