如何向用户分配的标识授予对密钥保管库的访问权限?

How can I give access to key vault to a user assigned identity?

是否可以向用户分配的身份授予对密钥保管库的访问权限?

在 Azure 门户的托管身份中,我创建了一个新身份 "KeyVaultIdentity",并将其分配给 Web 应用程序(在身份中,用户分配的身份选项卡)。在 Key Vault 的访问策略中,我添加了新创建的 "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;
        }

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

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

Do you have any idea how can I make this work with the user assigned identity?

您可以按照 How to use managed identities for App Service and Azure Functions 中的步骤进行操作。

步骤如下:

1.In webapp Identity,单击 User Assigned(preview) 并添加您的用户分配的托管标识。

2.Adding 用户分配的类型和 cotells Azure 使用 Azure 资源管理器模板为您的应用程序创建和管理标识。

"identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
            "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName'))]": {}
        }
    }

3.If 您向 Key Vault 请求令牌,您需要确保您已添加包含应用程序身份的访问策略。否则,您对 Key Vault 的调用将被拒绝,即使它们包含令牌也是如此。

4.Using Microsoft.Azure.Services.AppAuthentication 用于 .NET 的库获得机密。

var azureServiceTokenProvider = new AzureServiceTokenProvider();
            var keyVaultClient = new KeyVaultClient(
               new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));

            var secret = keyVaultClient.GetSecretAsync("https://yourkeyvaultname.vault.azure.net/secrets/secretname").Result.Value;

5.The输出如下:

我遇到了同样的问题,每次我尝试使用用户分配的身份访问 KeyVault 时,我都必须做两件事才能获得 "forbidden":

  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();

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

如果您 运行 遇到此错误 Connection string is not valid. Must contain 'TenantId' 那么请确保您明确引用 Microsoft.Azure.Services.AppAuthentication >= v1.2.0

我使用的是 Microsoft.Extensions.Configuration.AzureKeyVault v3.1.3,它附带较低版本的 AppAuthentication,因此用户分配的身份不起作用。

更多信息在这里: https://github.com/MicrosoftDocs/azure-docs/issues/28729