Tutorial: Gunakan identitas terkelola untuk menghubungkan Key Vault ke aplikasi web Azure di .NET

Azure Key Vault menyediakan cara untuk menyimpan mandat dan rahasia lainnya dengan peningkatan keamanan. Tetapi kode Anda perlu mengautentikasi ke Key Vault untuk mengambilnya. Identitas terkelola untuk sumber daya Azure membantu menyelesaikan masalah ini dengan memberi layanan Azure identitas yang dikelola secara otomatis di ID Microsoft Entra. Anda dapat menggunakan identitas ini untuk mengautentikasi ke layanan apa pun yang mendukung autentikasi Microsoft Entra, termasuk Key Vault, tanpa harus menampilkan kredensial dalam kode Anda.

Dalam tutorial ini, Anda akan membuat dan menggunakan aplikasi web Azure ke Azure App Service. Anda akan menggunakan identitas terkelola untuk mengautentikasi aplikasi web Azure Anda dengan brankas kunci Azure menggunakan pustaka klien rahasia Azure Key Vault untuk .NET dan Azure CLI. Prinsip dasar yang sama berlaku saat Anda menggunakan bahasa pengembangan pilihan Anda, Azure PowerShell, dan/atau portal Microsoft Azure.

Untuk informasi selengkapnya tentang aplikasi web layanan Azure App dan penerapan yang disajikan dalam tutorial ini, lihat:

Prasyarat

Untuk menyelesaikan tutorial ini, Anda perlu:

Jika aplikasi web Anda sudah diterapkan di Azure App Service, Anda dapat melompat untuk mengonfigurasi akses aplikasi web ke brankas kunci dan mengubah bagian kode aplikasi web.

Buat aplikasi .NET Core

Dalam langkah ini, Anda akan menyiapkan proyek .NET Core lokal.

Di jendela terminal pada komputer Anda, buat direktori bernama akvwebapp dan jadikan sebagai direktori saat ini:

mkdir akvwebapp
cd akvwebapp

Buat aplikasi .NET Core dengan menggunakan perintah web baru dotnet :

dotnet new web

Jalankan aplikasi secara lokal sehingga Anda tahu bagaimana tampilannya saat Anda menerapakannya ke Azure:

dotnet run

Di browser web, buka aplikasi di http://localhost:5000.

Anda akan melihat pesan "Halo Dunia!" dari aplikasi contoh yang ditampilkan di halaman.

Untuk informasi selengkapnya tentang membuat aplikasi web untuk Azure, lihat Membuat aplikasi web ASP.NET Core di Azure App Service

Menyebarkan aplikasi ke Azure

Dalam langkah ini, Anda akan menggunakan aplikasi .NET Core ke Azure App Service dengan menggunakan Git lokal. Untuk informasi selengkapnya tentang cara membuat dan menggunakan aplikasi, lihat Membuat aplikasi web ASP.NET Core di Azure.

Mengonfigurasi penerapan Git lokal

Di jendela terminal, pilih Ctrl+C untuk menutup server web. Menginisialisasi repositori Git untuk proyek .NET Core:

git init --initial-branch=main
git add .
git commit -m "first commit"

Anda dapat menggunakan FTP dan Git lokal untuk menggunakan aplikasi web Azure dengan menggunakan penerapan pengguna. Setelah mengonfigurasi pengguna penerapan, Anda dapat menggunakannya untuk semua penerapan Azure Anda. Nama pengguna dan kata sandi penyebaran tingkat akun Anda berbeda dari mandat langganan Azure Anda.

Untuk mengonfigurasi penerapan pada pengguna, jalankan perintah kumpulan pengguna penyebaran az webapp. Pilih nama pengguna dan kata sandi yang mematuhi panduan ini:

  • Nama pengguna harus unik dalam Azure. Untuk git lokal mendorong, itu tidak dapat berisi simbol tanda at (@).
  • Kata sandi harus panjangnya minimal delapan karakter dan berisi dua dari tiga elemen berikut: huruf, angka, dan simbol.
az webapp deployment user set --user-name "<username>" --password "<password>"

Output JSON menunjukkan kata sandi sebagai null. Jika Anda mendapatkan 'Conflict'. Details: 409 kesalahan, ubah nama pengguna. Jika Anda mendapatkan 'Bad Request'. Details: 400 kesalahan, gunakan kata sandi yang lebih kuat.

Rekam nama pengguna dan kata sandi Anda sehingga Anda dapat menggunakannya untuk menyebarkan aplikasi web Anda.

Buat grup sumber daya

Grup sumber daya Azure adalah kontainer logis yang Anda sebarkan dan mengelola sumber daya Azure Anda. Buat grup sumber daya untuk berisi brankas kunci dan aplikasi web Anda dengan menggunakan perintah buat grup az:

az group create --name "myResourceGroup" -l "EastUS"

Membuat Paket App Service

Buat paket Layanan Aplikasi dengan menggunakan perintah buat paket layanan aplikasi CLI Azure az. Contoh berikut membuat rencana App Service yang dinamai myAppServicePlan dalam FREE tingkat harga:

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku FREE

Saat paket Layanan Aplikasi dibuat, CLI Azure menampilkan informasi yang mirip dengan apa yang Anda lihat di sini:

{ 
  "adminSiteName": null,
  "appServicePlanName": "myAppServicePlan",
  "geoRegion": "West Europe",
  "hostingEnvironmentProfile": null,
  "id": "/subscriptions/0000-0000/resourceGroups/myResourceGroup/providers/Microsoft.Web/serverfarms/myAppServicePlan",
  "kind": "app",
  "location": "West Europe",
  "maximumNumberOfWorkers": 1,
  "name": "myAppServicePlan",
  < JSON data removed for brevity. >
  "targetWorkerSizeId": 0,
  "type": "Microsoft.Web/serverfarms",
  "workerTierName": null
} 

Untuk informasi selengkapnya, lihat Mengelola paket Layanan Aplikasi di Azure.

Membuat aplikasi web

Buat aplikasi web Azure di paket myAppServicePlan Layanan Aplikasi.

Penting

Seperti brankas kunci, aplikasi web Azure harus memiliki nama yang unik. Ganti <your-webapp-name> dengan nama aplikasi web Anda dalam contoh berikut.

az webapp create --resource-group "myResourceGroup" --plan "myAppServicePlan" --name "<your-webapp-name>" --deployment-local-git

Saat aplikasi web dibuat, CLI Azure menampilkan output yang mirip dengan apa yang Anda lihat di sini:

Local git is configured with url of 'https://<username>@<your-webapp-name>.scm.azurewebsites.net/<ayour-webapp-name>.git'
{
  "availabilityState": "Normal",
  "clientAffinityEnabled": true,
  "clientCertEnabled": false,
  "clientCertExclusionPaths": null,
  "cloningInfo": null,
  "containerSize": 0,
  "dailyMemoryTimeQuota": 0,
  "defaultHostName": "<your-webapp-name>.azurewebsites.net",
  "deploymentLocalGitUrl": "https://<username>@<your-webapp-name>.scm.azurewebsites.net/<your-webapp-name>.git",
  "enabled": true,
  < JSON data removed for brevity. >
}

URL remote Git ditampilkan di deploymentLocalGitUrl properti, dalam format https://<username>@<your-webapp-name>.scm.azurewebsites.net/<your-webapp-name>.git. Simpan URL ini. Anda akan membutuhkannya nanti.

Sekarang konfigurasikan aplikasi web Anda untuk diterapkan dari main cabang:

 az webapp config appsettings set -g MyResourceGroup --name "<your-webapp-name>" --settings deployment_branch=main

Buka aplikasi baru Anda dengan menggunakan perintah berikut. Ganti <your-webapp-name> dengan nama aplikasi Anda.

https://<your-webapp-name>.azurewebsites.net

Anda akan melihat halaman web default untuk aplikasi web Azure baru.

Menerapkan aplikasi lokal Anda

Kembali ke jendela terminal lokal, tambahkan remote Azure ke repositori Git lokal Anda. Dalam perintah berikut, <deploymentLocalGitUrl-from-create-step> ganti dengan URL remote Git yang Anda simpan di bagian Buat aplikasi web.

git remote add azure <deploymentLocalGitUrl-from-create-step>

Gunakan perintah berikut untuk mendorong ke remote Azure untuk menerapkan aplikasi Anda. Saat Git Credential Manager meminta mandat kepada Anda, gunakan mandat yang Anda buat di bagian Konfigurasikan penerapan Git lokal.

git push azure main

Perintah ini mungkin perlu waktu beberapa menit untuk dijalankan. Saat dijalankan, ia menampilkan informasi yang mirip dengan apa yang Anda lihat di sini:

Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 285 bytes | 95.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Deploy Async
remote: Updating branch 'main'.
remote: Updating submodules.
remote: Preparing deployment for commit id 'd6b54472f7'.
remote: Repository path is /home/site/repository
remote: Running oryx build...
remote: Build orchestrated by Microsoft Oryx, https://github.com/Microsoft/Oryx
remote: You can report issues at https://github.com/Microsoft/Oryx/issues
remote:
remote: Oryx Version      : 0.2.20200114.13, Commit: 204922f30f8e8d41f5241b8c218425ef89106d1d, ReleaseTagName: 20200114.13
remote: Build Operation ID: |imoMY2y77/s=.40ca2a87_
remote: Repository Commit : d6b54472f7e8e9fd885ffafaa64522e74cf370e1
.
.
.
remote: Deployment successful.
remote: Deployment Logs : 'https://<your-webapp-name>.scm.azurewebsites.net/newui/jsonviewer?view_url=/api/deployments/d6b54472f7e8e9fd885ffafaa64522e74cf370e1/log'
To https://<your-webapp-name>.scm.azurewebsites.net:443/<your-webapp-name>.git
   d87e6ca..d6b5447  main -> main

Buka (atau refresh) aplikasi yang disebarkan dengan menggunakan browser web Anda:

http://<your-webapp-name>.azurewebsites.net

Anda akan melihat pesan "Halo Dunia!" yang dilihat sebelumnya ketika Anda berkunjung http://localhost:5000.

Untuk informasi selengkapnya tentang menggunakan aplikasi web menggunakan Git, lihat penerapan Git Lokal ke Azure App Service

Mengonfigurasi aplikasi web untuk menyambungkan ke Key Vault

Di bagian ini, Anda akan mengonfigurasi akses web ke Key Vault dan memperbarui kode aplikasi untuk mengambil rahasia dari Key Vault.

Membuat dan menetapkan identitas terkelola

Dalam tutorial ini, kita akan menggunakan identitas terkelola untuk mengautentikasi ke Key Vault. Identitas terkelola secara otomatis mengelola mandat aplikasi.

Di CLI Azure, untuk membuat identitas untuk aplikasi, jalankan perintah tetapkan az webapp-identity :

az webapp identity assign --name "<your-webapp-name>" --resource-group "myResourceGroup"

Perintah akan mengembalikan cuplikan JSON ini:

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

Untuk memberi izin aplikasi web Anda untuk melakukan operasi mendapatkan dan daftar di brankas kunci Anda, berikan perintah principalId ke CLI Azure az keyvault set-policy:

az keyvault set-policy --name "<your-keyvault-name>" --object-id "<principalId>" --secret-permissions get list

Anda juga dapat menetapkan kebijakan akses dengan menggunakan portal Microsoft Azure atau PowerShell.

Ubah aplikasi untuk mengakses brankas kunci Anda

Dalam tutorial ini, Anda akan menggunakan pustaka klien rahasia Azure Key Vault untuk tujuan demonstrasi. Anda juga dapat menggunakan pustaka klien sertifikat Azure Key Vaultatau pustaka klien kunci Azure Key Vault.

Menginstal paket

Dari jendela terminal, instal pustaka klien rahasia Azure Key Vault untuk paket pustaka klien .NET dan Azure Identity:

dotnet add package Azure.Identity
dotnet add package Azure.Security.KeyVault.Secrets

Memperbarui kode

Temukan dan buka file Startup.cs untuk .NET 5.0 atau yang lebih lama, atau file Program.cs untuk .NET 6.0 di proyek akvwebapp Anda.

Tambahkan baris ini ke header:

using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using Azure.Core;

Tambahkan baris berikut sebelum app.UseEndpoints panggilan (.NET 5.0 atau yang lebih lama) atau app.MapGet panggil (.NET 6.0), perbarui URI untuk mencerminkan vaultUri brankas kunci Anda. Kode ini menggunakan DefaultAzureCredential() untuk mengautentikasi Key Vault yang menggunakan token dari identitas terkelola untuk melakukan autentikasi. Untuk informasi selengkapnya tentang mengautentikasi ke Key Vault, lihat Panduan Pengembang. Kode ini juga menggunakan backoff eksponensial untuk dicoba jika Key Vault sedang dicekik. Untuk informasi selengkapnya tentang batas transaksi Vault Utama, lihat Panduan pembatasan Azure Key Vault.

SecretClientOptions options = new SecretClientOptions()
    {
        Retry =
        {
            Delay= TimeSpan.FromSeconds(2),
            MaxDelay = TimeSpan.FromSeconds(16),
            MaxRetries = 5,
            Mode = RetryMode.Exponential
         }
    };
var client = new SecretClient(new Uri("https://<your-unique-key-vault-name>.vault.azure.net/"), new DefaultAzureCredential(),options);

KeyVaultSecret secret = client.GetSecret("<mySecret>");

string secretValue = secret.Value;
.NET 5.0 atau sebelumnya

Perbarui garis await context.Response.WriteAsync("Hello World!"); agar terlihat seperti baris ini:

await context.Response.WriteAsync(secretValue);
.NET 6.0

Perbarui garis app.MapGet("/", () => "Hello World!"); agar terlihat seperti baris ini:

app.MapGet("/", () => secretValue);

Pastikan untuk menyimpan perubahan Anda sebelum melanjutkan ke langkah berikutnya.

Menyebarkan ulang aplikasi web Anda

Setelah memperbarui kode, Anda dapat melakukan redeploy ke Azure dengan menggunakan perintah Git berikut:

git add .
git commit -m "Updated web app to access my key vault"
git push azure main

Masuk ke aplikasi web anda yang sudah selesai

http://<your-webapp-name>.azurewebsites.net

Di mana sebelum Anda melihat "Halo Dunia!", Anda sekarang harus melihat nilai rahasia Anda ditampilkan.

Langkah berikutnya