Oefening: een aangepaste toepassing in .NET configureren met een beheerde identiteit
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
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.Ga naar de map identity/secretapp .
cd ~/identity/secretapp
Open het bestand Program.cs met behulp van de nano-editor.
nano Program.cs
Dit bestand bevat de C#-broncode voor de voorbeeldapp.
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.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 vanDefaultAzureCredential
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 vanSecretClient
gegenereerd dat dit verificatieschema gebruikt. U kunt dit exemplaar vanSecretClient
gebruiken om toegang te krijgen tot geheimen in de sleutelkluis.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 vanSecretClient
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.
Als u de wijzigingen wilt opslaan, drukt u op Ctrl+O en drukt u vervolgens op Enter.
Druk op Ctrl+X om de nano-editor te sluiten.
De toepassing testen
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.
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
Sluit de verbinding met de virtuele machine.
exit
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 vanprodserver
.)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.
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
Meld u aan bij uw virtuele machine.
ssh $publicIP
Ga naar de
identity/secretapp
map.cd ~/identity/secretapp
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;