3
votes

Comment puis-je donner accès au coffre de clés à une identité attribuée à un utilisateur?

Est-il possible de donner accès à un coffre de clés à une identité attribuée par un utilisateur?

Dans Managed Identities du portail azure, j'ai créé une nouvelle identité "KeyVaultIdentity", que je l'ai affectée à une application Web (dans Identity, onglet identités attribuées par l'utilisateur). Dans les politiques d'accès du coffre-fort de clés, j'ai ajouté la nouvelle identité "KeyVaultIdentity" créée et j'ai offert des autorisations pour accéder aux secrets.

J'utilise le code suivant pour accéder au coffre de clés:

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;
        }

Mais il est dit que l'accès est interdit lorsque j'essaye d'accéder au secret. Cependant, si dans Key Vault, je donne accès à l'identité attribuée par le système de l'application Web, je peux accéder au secret,

Avez-vous une idée de la façon dont je peux faire fonctionner cela avec l'identité attribuée à l'utilisateur? p>


0 commentaires

3 Réponses :


3
votes

Avez-vous une idée de la manière dont je peux faire fonctionner cela avec l'identité attribuée à l'utilisateur?

Vous pouvez suivre les étapes de Comment utiliser les identités gérées pour App Service et Azure Functions .

Voici les étapes:

1.Dans Identité de l'application Web, cliquez sur Attribué par l'utilisateur (aperçu) et ajoutez votre utilisateur- identité gérée attribuée.

2.Ajout du type attribué par l'utilisateur et d'un cotell Azure pour créer et gérer l'identité de votre application à l'aide d'un modèle Azure Resource Manager.

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;

3.Si vous demandez un jeton à Key Vault, vous devez vous assurer que vous avez ajouté une politique d'accès qui inclut l'identité de votre application . Sinon, vos appels à Key Vault seront rejetés, même s'ils incluent le jeton.

 entrez la description de l'image ici

4.Utilisation de la bibliothèque Microsoft.Azure.Services.AppAuthentication pour .NET pour obtenir secret.

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

5. La sortie est comme ci-dessous: entrez la description de l'image ici


0 commentaires

8
votes

J'ai eu le même problème, et j'ai dû faire deux choses pour être «interdit» chaque fois que j'essayais d'accéder à KeyVault avec une identité attribuée par l'utilisateur:

  1. Mettez à niveau la version de Microsoft.Azure.Services.AppAuthentication que j'utilisais vers 1.2.0-preview2. Les versions antérieures ne prennent pas en charge les identités attribuées par l'utilisateur.

  2. Passez une chaîne de connexion dans le constructeur AzureServiceTokenProvider pour indiquer au service quelle identité utiliser. C'est le bit que tous les liens ci-dessus omettent. J'ai donc eu:

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

au lieu de:

var azureServiceTokenProvider = new AzureServiceTokenProvider();

Pour trouver la valeur de votre clientId, ouvrez votre identité gérée dans le portail Azure. Vous devriez voir un champ marqué "ID client". C'est celui que vous voulez.


1 commentaires

Dans mon cas, j'avais une "identité attribuée par l'utilisateur" pour un AppService qui essayait d'accéder à Key Vault et cette solution fonctionnait parfaitement pour moi. Le portail permet d'attribuer plusieurs "Identité affectée par l'utilisateur" pour un AppService et je pense que c'est la raison pour laquelle nous devrions passer "AppId" dans la chaîne de connexion. Il est également mentionné dans la section "Prise en charge des chaînes de connexion" dans docs.microsoft.com/en-us/azure/key-vault/…



1
votes

Si vous rencontrez cette erreur La chaîne de connexion n'est pas valide. Doit contenir 'TenantId' , puis assurez-vous de faire explicitement référence à Microsoft.Azure.Services.AppAuthentication> = v1.2.0

J'utilisais Microsoft.Extensions.Configuration.AzureKeyVault v3.1.3 qui est livré avec une version inférieure de AppAuthentication , donc les identités attribuées par l'utilisateur ne fonctionnaient pas.

Plus d'informations ici: https://github.com/MicrosoftDocs/azure-docs/issues/28729


0 commentaires