Kịch bản
Một ứng dụng .NET 8 (Web API, Azure Function, hoặc Console) cần lấy các bí mật (chuỗi kết nối DB, khóa Service Bus, API key) mà không lưu trong mã nguồn hay file cấu hình.
Yêu cầu trước
- Azure subscription với Key Vault đã tạo (
myKeyVault). - Managed Identity được bật trên tài nguyên Azure mục tiêu (App Service, Function App, VM, AKS pod, …).
- Định danh này có Key Vault Secrets User role trên vault (hoặc role tùy chỉnh có quyền
get). - Dự án .NET nhắm tới .NET 8 (hoặc .NET 6+).
Các bước thực hiện
- Thêm các gói NuGet
bash
dotnet add package Azure.Identity dotnet add package Azure.Security.KeyVault.Secrets - Cấu hình Azure SDK (
Program.cs)csharpusing Azure.Identity; using Azure.Security.KeyVault.Secrets; var builder = WebApplication.CreateBuilder(args); // Khi chạy trên Azure, DefaultAzureCredential sẽ tự động lấy Managed Identity. var keyVaultUrl = new Uri("https://myKeyVault.vault.azure.net/"); var secretClient = new SecretClient(keyVaultUrl, new DefaultAzureCredential()); builder.Services.AddSingleton(secretClient); var app = builder.Build(); - Sử dụng một bí mật
csharp
public class WeatherService { private readonly SecretClient _secretClient; public WeatherService(SecretClient secretClient) => _secretClient = secretClient; public async Task<string> GetApiKeyAsync() { KeyVaultSecret secret = await _secretClient.GetSecretAsync("WeatherApiKey"); return secret.Value; // Dùng key để gọi API bên ngoài } } - Phát triển cục bộ
- Cài Azure CLI và đăng nhập:
az login. - Đặt biến môi trường
AZURE_CLIENT_ID,AZURE_TENANT_ID,AZURE_CLIENT_SECRETcho một service principal có quyềngettrên vault. DefaultAzureCredentialsẽ tự động lấy chúng.
- Cài Azure CLI và đăng nhập:
- Chính sách truy cập Key Vault (thay cho RBAC)
bash
az keyvault set-policy \ --name myKeyVault \ --object-id <managed‑identity‑object‑id> \ --secret-permissions get list - Làm mới bí mật mà không khởi động lại
- SDK lưu cache bí mật trong 5 phút. Gọi
GetSecretAsyncmỗi request hoặc viết wrapper tự làm mới theo timer.
- SDK lưu cache bí mật trong 5 phút. Gọi
- Quản lý phiên bản & quay vòng
- Lưu mỗi phiên bản bí mật (
mySecret/2023‑09‑01). DùngsecretClient.GetSecretAsync("mySecret", "2023‑09‑01")để lấy phiên bản cụ thể. - Bật purge protection và soft‑delete để tránh mất dữ liệu.
- Lưu mỗi phiên bản bí mật (
Mẹo thực hành tốt
- Không bao giờ log giá trị bí mật – ẩn trong log (
ILoggervớiLogLevel.Information). - Sử dụng Managed Identity trong môi trường production; tránh nhúng client secret.
- Bật diagnostic logs trên vault và chuyển tới Azure Monitor.
- Cache có chọn lọc – cho các trường hợp traffic cao, cache bí mật trong bộ nhớ với TTL ngắn.
- Tách vault theo môi trường (dev, test, prod) để tránh rò rỉ giữa các môi trường.
File thuộc mục Azure Playbooks của senior‑dotnet‑wiki.