Övning – Konfigurera ett anpassat program i .NET med hjälp av hanterade identiteter

Slutförd

Du kan lagra programanslutningssträngar, autentiseringsuppgifter, lösenord och annan känslig information i Azure Key Vault. Du måste ange autentiseringsuppgifter för att få åtkomst till Key Vault. Nu när programmet flyttas till en virtuell Azure-dator kan du uppdatera den så att den använder hanterade identiteter för att hämta en åtkomsttoken för att autentisera till Key Vault.

Ditt lagerspårningsprogram ansluter till Azure SQL Database. Tidigare lagrade den lokala appen anslutningssträngen i konfigurationsfilen. Som en del av migreringen till Azure lagrar du nu säkert alla autentiseringsuppgifter och anslutningssträng i ett Azure Key Vault.

Ditt lagerspårningsprogram körs på en virtuell dator (VM), så att du kan använda den systemtilldelade hanterade identiteten som du skapade. Du lägger till en policy i nyckelvalvet som ger rätt behörigheter till den virtuella datorn.

I den här övningen ska du redigera appen så att den använder det nya nyckelvalvet. Sedan beviljar du den hanterade identiteten för den virtuella datorn åtkomst så att appen kan hämta databasanslutningen. Slutligen skapar och kör du en app på den virtuella datorn för att komma åt Key Vault och hämta informationen.

Skapa en app för att hämta hemlig information från Key Vault

  1. Logga in på den virtuella dator som du skapade tidigare.

    ssh $publicIP
    

    Kommentar

    Om miljövariabeln publicIP inte har angetts återställer du den genom att köra följande kommando:

    export publicIP=$(az vm show \
        --name prodserver \
        --resource-group "<rgn>[sandbox resource group name]</rgn>" \
        --show-details \
        --query [publicIps] \
        --output tsv)
    

    Kör sedan kommandot igen ssh $publicIP .

  2. Flytta till mappen identity/secretapp .

    cd ~/identity/secretapp
    
  3. Öppna filen Program.cs med hjälp av nano-redigeraren.

    nano Program.cs
    

    Den här filen innehåller C#-källkoden för exempelprogrammet.

  4. Main Granska metoden.

    static async Task Main(string[] args)
    {
        await GetSecretFromKeyVault().ConfigureAwait(false);
    }
    

    Den här metoden är startpunkten för det program som bara anropar metoden GetSecretFromKeyVault.

  5. Gå ned till metoden GetSecretFromKeyVault. Granska metodens första kodblock.

    private static async Task GetSecretFromKeyVault()
    {
        var keyVaultName = "<key vault name>";
        Uri keyVaultUri = new Uri($"https://{keyVaultName}.vault.azure.net");
    
        SecretClient secretClient = new SecretClient(keyVaultUri, new DefaultAzureCredential());
        ...
    }
    

    Ersätt "<key vault name>" med namnet på ditt nyckelvalv. Den här koden använder DefaultAzureCredential för att autentisera den klient som kommer att skapa begäran. Koden hämtar i bakgrunden den systemhanterade identiteten för den virtuella dator som kör koden. Den genererar sedan en instans av SecretClient som kommer att använda det här autentiseringsschemat. Du kan använda den här SecretClient-instansen för att få åtkomst till hemligheter i nyckelvalvet.

  6. Titta på nästa del av koden.

    var keyVaultSecretName = "<secret name>";
    
    try
    {
        var secret = await secretClient.GetSecretAsync(keyVaultSecretName).ConfigureAwait(false);
    
        Console.WriteLine($"Secret: {secret.Value}");
    }
    catch (Exception exp)
    {
        Console.WriteLine($"Something went wrong: {exp.Message}");
    }
    

    Ersätt <secret name> med "DBCredentials", som är namnet på hemligheten du skapade i nyckelvalvet.

    Det här kodblocket anropar metoden GetSecretAsync i SecretClient för att hämta en specifik hemlighet och visa dess värde. Om klienten inte har behörighet att komma åt nyckeln utlöser den här koden ett undantag och visar ett felmeddelande.

    Kommentar

    Inga lösenord, certifikat eller klienthemligheter lagras i koden.

  7. Spara ändringarna genom att trycka på Ctrl+O och sedan på Retur.

  8. Stäng nanoredigeraren genom att trycka på Ctrl+X.

Testa programmet

  1. Kör följande kommando för att skapa programmet.

    dotnet restore
    dotnet build
    

    Om du redigerade programmet korrekt ska appen kompileras utan fel.

  2. Kör programmet.

    dotnet run
    

    Du har ännu inte gett tjänstens huvudnamn för den virtuella datorn behörighet att komma åt ditt nyckelvalv. Därför bör programmet svara med ett felmeddelande:

    Something went wrong: Operation returned an invalid status code 'Forbidden'

Ge behörighet så att tjänstens huvudnamn kan hämta hemligheter från Key Vault

  1. Stäng anslutningen till den virtuella datorn.

    exit
    
  2. I föregående övning skrev du ned huvudkonto-ID:t för din virtuella dator. Om du inte har kvar det kör du följande kommando för att ta fram den virtuella datorns systemtilldelade ID. (Variabeln $VMNAME angavs i föregående övning till värdet prodserver.)

    az vm identity show \
      --name $VMNAME \
      --resource-group "<rgn>[sandbox resource group name]</rgn>"
    

    Följande kod är ett exempel på det värde som returneras. Du kommer att ha andra ID:n.

    {
        "principalId": "aba6da53-9180-47fc-8fc4-4b35f154e845",
        "tenantId": "a95baa51-dcb1-4b9a-8312-8774a8afddbe",
        "type": "SystemAssigned",
        "userAssignedIdentities": null
    }
    

    Använd det här värdet till att endast returnera huvudkonto-ID:t i nästa kommando.

  3. Använd huvud-ID:t för att auktorisera den virtuella datorn för att hämta och lista hemligheter i ditt nyckelvalv.

    az keyvault set-policy \
        --name $KVNAME \
        --secret-permissions get list \
        --object-id $(az vm identity show \
                        --name $VMNAME \
                        --resource-group "<rgn>[sandbox resource group name]</rgn>" \
                        --output tsv \
                        --query principalId)
    

    Det returnerade värdet är i JSON-format. Den innehåller ID:t, plats, namn och alla tillhörande egenskaper.

Testa programmet igen

  1. Logga in på den virtuella datorn.

    ssh $publicIP
    
  2. Ändra till identity/secretapp mappen.

    cd ~/identity/secretapp
    
  3. Kör programmet.

    dotnet run
    

    Den här gången ska programmet hämta hemligheten från Key Vault och visa dess värde.

    Database connection string:: Server=tcp:prodserverSQL.database.windows.net,1433;Database=myDataBase;User ID=mylogin@myserver;Password=examplePassword;Trusted_Connection=False;Encrypt=True;