Didacticiel : Utiliser Azure Key Vault avec une application web Azure dans .NETTutorial: Use Azure Key Vault with an Azure web app in .NET

Azure Key Vault vous permet de protéger les secrets tels que les clés API et les chaînes de connexion de base de données.Azure Key Vault helps you protect secrets such as API keys and database connection strings. Il vous permet d’accéder à vos applications, services et ressources informatiques.It provides you with access to your applications, services, and IT resources.

Dans ce tutoriel, vous allez apprendre à créer une application web Azure qui peut lire des informations dans un coffre de clés Azure.In this tutorial, you learn how to create an Azure web application that can read information from an Azure key vault. Le processus utilise des identités managées pour les ressources Azure.The process uses managed identities for Azure resources. Pour plus d’informations sur les applications web Azure, consultez Azure App Service.For more information about Azure web applications, see Azure App Service.

Ce didacticiel explique les procédures suivantes :The tutorial shows you how to:

  • Création d’un coffre de clésCreate a key vault.
  • Ajoutez un secret au coffre de clés.Add a secret to the key vault.
  • Récupération d’un secret à partir du coffre de clés.Retrieve a secret from the key vault.
  • Créez une application web Azure.Create an Azure web app.
  • Activer une identité managée pour l’application web.Enable a managed identity for the web app.
  • Affectez une autorisation à l’application web.Assign permission for the web app.
  • Exécutez l’application web sur Azure.Run the web app on Azure.

Avant de continuer, lisez les concepts de base de Key Vault.Before you begin, read Key Vault basic concepts.

Si vous n’avez pas d’abonnement Azure, créez un compte gratuit.If you don’t have an Azure subscription, create a free account.

PrérequisPrerequisites

À propos de Managed Service Identity (MSI)About Managed Service Identity

Azure Key Vault stocke les informations d’identification de manière sécurisée, de façon à ce qu’elles n’apparaissent pas dans votre code.Azure Key Vault stores credentials securely, so they're not displayed in your code. Toutefois, vous devez vous authentifier auprès d’Azure Key Vault pour récupérer vos clés.However, you need to authenticate to Azure Key Vault to retrieve your keys. Pour vous authentifier auprès de Key Vault, vous avez besoin d’informations d’identification.To authenticate to Key Vault, you need a credential. Il s’agit d’un dilemme de démarrage classique.It's a classic bootstrap dilemma. Managed Service Identity (MSI) résout ce problème en fournissant une identité de démarrage.Managed Service Identity (MSI) solves this issue by providing a bootstrap identity that simplifies the process.

Lorsque vous activez MSI pour un service Azure, par exemple, Machines virtuelles Azure, Azure App Service ou Azure Functions, Azure crée un principal de service.When you enable MSI for an Azure service, such as Azure Virtual Machines, Azure App Service, or Azure Functions, Azure creates a service principal. MSI procède ainsi pour l’instance du service dans Azure Active Directory (Azure AD) et injecte les informations d’identification du principal de service dans cette instance.MSI does this for the instance of the service in Azure Active Directory (Azure AD) and injects the service principal credentials into that instance.

Diagramme MSI

Ensuite, pour obtenir un jeton d’accès, votre code appelle un service de métadonnées local disponible dans la ressource Azure.Next, to get an access token, your code calls a local metadata service that's available on the Azure resource. Votre code utilise alors le jeton qu’il obtient du point de terminaison local MSI_ENDPOINT pour s’authentifier auprès d’un service Azure Key Vault.Your code uses the access token that it gets from the local MSI endpoint to authenticate to an Azure Key Vault service.

Connexion à AzureLog in to Azure

Pour vous connecter à Azure à l’aide de l’interface CLI, entrez :To log in to Azure by using the Azure CLI, enter:

az login

Créer un groupe de ressourcesCreate a resource group

Un groupe de ressources Azure est un conteneur logique dans lequel les ressources Azure sont déployées et gérées.An Azure resource group is a logical container into which Azure resources are deployed and managed.

Créez un groupe de ressources avec la commande az group create.Create a resource group by using the az group create command.

Sélectionnez ensuite un nom de groupe de ressources et renseignez l’espace réservé.Then, select a resource group name and fill in the placeholder. L’exemple suivant crée un groupe de ressources dans l’emplacement USA Ouest :The following example creates a resource group in the West US location:

# To list locations: az account list-locations --output table
az group create --name "<YourResourceGroupName>" --location "West US"

Vous allez utiliser ce groupe de ressources tout au long du tutoriel.You use this resource group throughout this tutorial.

Création d’un coffre de clésCreate a key vault

Pour créer un coffre de clés dans votre groupe de ressources, fournissez les informations suivantes :To create a key vault in your resource group, provide the following information:

  • Nom du coffre de clés : chaîne de 3 à 24 caractères qui ne peut contenir que des chiffres (0-9), des lettres (a-z, A-Z) et des traits d’union (-).Key vault name: a string of 3 to 24 characters that can contain only numbers (0-9), letters (a-z, A-Z), and hyphens (-)
  • Nom de groupe ressourcesResource group name
  • Localisation : USA OuestLocation: West US

Dans Azure CLI, entrez la commande suivante :In the Azure CLI, enter the following command:

az keyvault create --name "<YourKeyVaultName>" --resource-group "<YourResourceGroupName>" --location "West US"

À ce stade, votre compte Azure est le seul autorisé à effectuer des opérations sur ce nouveau coffre.At this point, your Azure account is the only one that's authorized to perform operations on this new vault.

Ajouter un secret au coffre de clésAdd a secret to the key vault

Vous pouvez maintenant ajouter un secret.Now you can add a secret. Il peut s’agir d’une chaîne de connexion SQL ou de toute autre information que vous devez sécuriser et garder à disposition pour votre application.It might be a SQL connection string or any other information that you need to keep both secure and available to your application.

Pour créer un secret dans le coffre de clés appelé AppSecret, tapez la commande suivante :To create a secret in the key vault called AppSecret, enter the following command:

az keyvault secret set --vault-name "<YourKeyVaultName>" --name "AppSecret" --value "MySecret"

Ce secret stocke la valeur MySecret.This secret stores the value MySecret.

Pour voir la valeur contenue dans le secret sous forme de texte brut, entrez la commande suivante :To view the value that's contained in the secret as plain text, enter the following command:

az keyvault secret show --name "AppSecret" --vault-name "<YourKeyVaultName>"

Cette commande affiche les informations du secret, y compris l’URI.This command displays the secret information, including the URI.

Une fois ces étapes terminées, vous devez avoir un URI pointant vers un secret dans le coffre de clés.After you complete these steps, you should have a URI to a secret in a key vault. Notez ces informations pour pouvoir les utiliser plus tard dans ce didacticiel.Make note of this information for later use in this tutorial.

Créer une application web .NET CoreCreate a .NET Core web app

Pour créer une application web .NET Core et la publier sur Azure, suivez les instructions de la section créer une application web ASP.NET Core dans Azure.To create a .NET Core web app and publish it to Azure, follow the instructions in Create an ASP.NET Core web app in Azure.

Vous pouvez également regarder cette vidéo :You can also watch this video:

Ouvrir et modifier la solutionOpen and edit the solution

  1. Accédez au fichier Pages > About.cshtml.cs.Go to the Pages > About.cshtml.cs file.

  2. Installez ces packages NuGet :Install these NuGet packages:

  3. Importez le code suivant dans le fichier About.cshtml.cs :Import the following code to the About.cshtml.cs file:

     using Microsoft.Azure.KeyVault;
     using Microsoft.Azure.KeyVault.Models;
     using Microsoft.Azure.Services.AppAuthentication;
    

    Votre code dans la classe AboutModel doit ressembler à ceci :Your code in the AboutModel class should look like this:

     public class AboutModel : PageModel
     {
         public string Message { get; set; }
    
         public async Task OnGetAsync()
         {
             Message = "Your application description page.";
             int retries = 0;
             bool retry = false;
             try
             {
                 /* The next four lines of code show 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://<YourKeyVaultName>.vault.azure.net/secrets/AppSecret")
                         .ConfigureAwait(false);
                 Message = secret.Value;
             }
             /* If you have throttling errors see this tutorial https://docs.microsoft.com/azure/key-vault/tutorial-net-create-vault-azure-web-app */
             /// <exception cref="KeyVaultErrorException">
             /// Thrown when the operation returned an invalid status code
             /// </exception>
             catch (KeyVaultErrorException keyVaultException)
             {
                 Message = keyVaultException.Message;
             }
         }
    
         // This method implements exponential backoff if there are 429 errors from Azure Key Vault
         private static long getWaitTime(int retryCount)
         {
             long waitTime = ((long)Math.Pow(2, retryCount) * 100L);
             return waitTime;
         }
    
         // This method fetches a token from Azure Active Directory, which can then be provided to Azure Key Vault to authenticate
         public async Task<string> GetAccessTokenAsync()
         {
             var azureServiceTokenProvider = new AzureServiceTokenProvider();
             string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://vault.azure.net");
             return accessToken;
         }
     }
    

Exécuter l’application webRun the web app

  1. Dans le menu principal de Visual Studio 2019, sélectionnez Déboguer > Démarrer, avec ou sans débogage.On the main menu of Visual Studio 2019, select Debug > Start, with or without debugging.
  2. Dans le navigateur, accédez à la page À propos de.In the browser, go to the About page.
    La valeur d’AppSecret s’affiche.The value for AppSecret is displayed.

Activer une identité managéeEnable a managed identity

Azure Key Vault permet de stocker des informations d’identification et autres secrets de manière sécurisée. Toutefois, votre code doit s’authentifier auprès de Key Vault pour les récupérer.Azure Key Vault provides a way to securely store credentials and other secrets, but your code needs to authenticate to Key Vault to retrieve them. La vue d’ensemble des identités managées pour les ressources Azure vous aide à résoudre ce problème en fournissant automatiquement aux services Azure une identité managée dans Azure AD.Managed identities for Azure resources overview helps to solve this problem by giving Azure services an automatically managed identity in Azure AD. Vous pouvez utiliser cette identité pour vous authentifier sur n’importe quel service prenant en charge l’authentification Azure AD, y compris Key Vault, sans avoir à afficher les informations d’identification dans votre code.You can use this identity to authenticate to any service that supports Azure AD authentication, including Key Vault, without having to display credentials in your code.

Dans Azure CLI, pour créer l’identité de cette application, exécutez la commande assign-identity :In the Azure CLI, to create the identity for this application, run the assign-identity command:

az webapp identity assign --name "<YourAppName>" --resource-group "<YourResourceGroupName>"

Remplacez <YourAppName> par le nom de l’application publiée dans Azure.Replace <YourAppName> with the name of the published app on Azure.
Par exemple, si le nom de votre application publiée était MyAwesomeapp.azurewebsites.net, remplacez <YourAppName> par MyAwesomeapp.For example, if your published app name was MyAwesomeapp.azurewebsites.net, replace <YourAppName> with MyAwesomeapp.

Prenez note de PrincipalId quand vous publiez l’application dans Azure.Make a note of the PrincipalId when you publish the application to Azure. À l’étape 1, la sortie de la commande doit être au format suivant :The output of the command in step 1 should be in the following format:

{
  "principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "type": "SystemAssigned"
}

Notes

La commande dans cette procédure revient à accéder au portail Azure et à affecter au paramètre Identité/Affecté(e) par le système la valeur Activer dans les propriétés de l’application web.The command in this procedure is the equivalent of going to the Azure portal and switching the Identity / System assigned setting to On in the web application properties.

Accorder des autorisations à votre applicationAssign permissions to your app

Remplacez <YourKeyVaultName> par le nom de votre coffre de clés et <PrincipalId> par la valeur de PrincipalId dans la commande suivante :Replace <YourKeyVaultName> with the name of your key vault, and replace <PrincipalId> with the value of the PrincipalId in the following command:

az keyvault set-policy --name '<YourKeyVaultName>' --object-id <PrincipalId> --secret-permissions get list

Cette commande fournit l’identité MSI de l’autorisation App Service pour effectuer des opérations get et list sur votre coffre de clés.This command gives the identity (MSI) of the app service permission to do get and list operations on your key vault.

Publier l’application web dans AzurePublish the web app to Azure

Republiez votre application web dans Azure pour vérifier si votre application web en production peut récupérer la valeur du secret.Publish your web app to Azure once again to verify that your live web app can fetch the secret value.

  1. Dans Visual Studio, sélectionnez le projet key-vault-dotnet-core-quickstart.In Visual Studio, select the key-vault-dotnet-core-quickstart project.
  2. Sélectionnez Publier > Démarrer.Select Publish > Start.
  3. Sélectionnez Create (Créer).Select Create.

Lorsque vous exécutez l’application, vous voyez normalement qu’elle peut récupérer votre valeur de secret.When you run the application, you should see that it can retrieve your secret value.

Vous avez créé une application web dans .NET qui stocke et récupère ses secrets à partir de votre coffre de clés.Now, you've successfully created a web app in .NET that stores and fetches its secrets from your key vault.

Supprimer des ressourcesClean up resources

Quand ils ne sont plus nécessaires, vous pouvez supprimer la machine virtuelle et le coffre de clés.When they are no longer needed, you can delete the virtual machine and your key vault.

Étapes suivantesNext steps