Oefening: een aangepaste toepassing in .NET configureren met een beheerde identiteit

Voltooid

U kunt verbindingsreeksen, referenties, wachtwoorden en andere gevoelige informatie voor de toepassing opslaan in Azure Key Vault. U moet referenties opgeven voor toegang tot Key Vault. Als onderdeel van de toepassing wordt verplaatst naar een Azure-VM, kunt u deze bijwerken om beheerde identiteiten te gebruiken om een toegangstoken op te halen voor verificatie bij Key Vault.

Uw toepassing voor voorraadbeheer wordt verbonden met Azure SQL Database. Eerder werd de verbindingsreeks door uw on-premises app in configuratiebestanden opgeslagen. Als onderdeel van de migratie naar Azure slaat u nu alle referenties en verbindingsreeks s op in een Azure Key Vault.

Uw toepassing voor voorraadtracking wordt uitgevoerd op een virtuele machine (VM), zodat u de door het systeem toegewezen beheerde identiteit kunt gebruiken die u hebt gemaakt. U voegt een beleid toe aan de sleutelkluis, die de juiste machtigingen aan de virtuele machine verleent.

In deze oefening bewerkt u uw app zodat de nieuwe sleutelkluis wordt gebruikt. Vervolgens verleent u de beheerde identiteit voor de VM-toegang, zodat de app de databaseverbinding kan ophalen. Ten slotte bouwt en voert u een app uit op de virtuele machine om toegang te krijgen tot Key Vault en haalt u de informatie op.

Een app maken om geheime informatie uit Key Vault op te halen

  1. Meld u aan bij de VM die u eerder hebt gemaakt.

    ssh $publicIP
    

    Notitie

    Als de omgevingsvariabele publicIP niet is ingesteld, stelt u deze opnieuw in door de volgende opdracht uit te voeren:

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

    Voer vervolgens de ssh $publicIP opdracht opnieuw uit.

  2. Ga naar de map identity/secretapp .

    cd ~/identity/secretapp
    
  3. Open het bestand Program.cs met behulp van de nano-editor.

    nano Program.cs
    

    Dit bestand bevat de C#-broncode voor de voorbeeldapp.

  4. Bekijk de Main methode.

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

    Deze methode is het beginpunt van de toepassing, die alleen de methode GetSecretFromKeyVault aanroept.

  5. Schuif omlaag naar de GetSecretFromKeyVault-methode. Bekijk het eerste codeblok van de methode.

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

    Vervang "<key vault name>" door uw sleutelkluisnaam. Deze code maakt gebruik van DefaultAzureCredential om de client te verifiëren die de aanvraag heeft ingediend. Achter de schermen krijgt deze code de door het systeem beheerde identiteit voor de virtuele machine waarop de code wordt uitgevoerd. Vervolgens wordt een exemplaar van SecretClient gegenereerd dat dit verificatieschema gebruikt. U kunt dit exemplaar van SecretClient gebruiken om toegang te krijgen tot geheimen in de sleutelkluis.

  6. Bekijk het volgende deel van de code.

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

    Vervang <secret name> door "DBCredentials". Dit is de naam van het geheim dat u hebt gemaakt in de sleutelkluis.

    Met dit codeblok wordt de GetSecretAsync-methode van SecretClient aangeroepen om een specifiek geheim op te halen en de waarde daarvan weer te geven. Als de client geen toegang heeft tot de sleutel, genereert deze code een uitzondering en wordt er een foutbericht weergegeven.

    Notitie

    Er wordt geen wachtwoord, certificaat of clientgeheim opgeslagen in de code.

  7. Als u de wijzigingen wilt opslaan, drukt u op Ctrl+O en drukt u vervolgens op Enter.

  8. Druk op Ctrl+X om de nano-editor te sluiten.

De toepassing testen

  1. Voer de volgende opdracht uit om de toepassing te maken.

    dotnet restore
    dotnet build
    

    Als u het programma op de juiste manier hebt bewerkt, wordt de app zonder fouten opgebouwd.

  2. Voer de toepassing uit.

    dotnet run
    

    U hebt de service-principal van de virtuele machine nog niet geverifieerd voor toegang tot uw sleutelkluis. Daarom moet de toepassing reageren met een foutbericht:

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

Toestemming verlenen om de service-principal in te schakelen en geheimen uit Key Vault op te halen

  1. Sluit de verbinding met de virtuele machine.

    exit
    
  2. In de vorige oefening hebt u de principal-id voor uw virtuele machine genoteerd. Als u de principal-id bent vergeten, voert u de volgende opdracht uit om de aan het systeem toegewezen id voor uw virtuele machine te zoeken. (De $VMNAME variabele is in de vorige oefening ingesteld op een waarde van prodserver.)

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

    De volgende code is een voorbeeld van de geretourneerde waarde. Uw id's zijn anders.

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

    Gebruik deze waarde om alleen de principal-id te retourneren in de volgende opdracht.

  3. Gebruik de principal-id om de VM te autoriseren om geheimen in uw sleutelkluis op te halen en weer te geven.

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

    De geretourneerde waarde wordt in JSON-indeling weergegeven. Het bevat de id, locatie, naam en alle bijbehorende eigenschappen.

De toepassing opnieuw testen

  1. Meld u aan bij uw virtuele machine.

    ssh $publicIP
    
  2. Ga naar de identity/secretapp map.

    cd ~/identity/secretapp
    
  3. Voer de toepassing uit.

    dotnet run
    

    Deze keer moet de toepassing het geheim ophalen uit Key Vault en de waarde ervan weergeven.

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