Penyimpanan rahasia aplikasi yang aman dalam pengembangan di ASP.NET Core

Oleh Rick Anderson dan Kirk Larkin

Melihat atau mengunduh kode sampel (cara mengunduh)

Dokumen ini menjelaskan cara mengelola data sensitif untuk aplikasi ASP.NET Core pada komputer pengembangan. Jangan pernah menyimpan kata sandi atau data sensitif lainnya dalam kode sumber. Rahasia produksi tidak boleh digunakan untuk pengembangan atau pengujian. Rahasia tidak boleh disebarkan dengan aplikasi. Sebaliknya, rahasia produksi harus diakses melalui cara yang dikontrol seperti variabel lingkungan atau Azure Key Vault. Anda dapat menyimpan dan melindungi rahasia pengujian dan produksi Azure dengan penyedia konfigurasi Azure Key Vault.

Untuk menggunakan rahasia pengguna di aplikasi konsol .NET, lihat masalah GitHub ini.

Variabel lingkungan

Variabel lingkungan digunakan untuk menghindari penyimpanan rahasia aplikasi dalam kode atau dalam file konfigurasi lokal. Variabel lingkungan mengambil alih nilai konfigurasi untuk semua sumber konfigurasi yang ditentukan sebelumnya.

Pertimbangkan aplikasi web ASP.NET Core tempat keamanan Akun Pengguna Individu diaktifkan. String koneksi database default disertakan dalam file proyek appsettings.json dengan kunci DefaultConnection. String koneksi default adalah untuk LocalDB, yang berjalan dalam mode pengguna dan tidak memerlukan kata sandi. Selama penyebaran aplikasi, DefaultConnection nilai kunci dapat ditimpa dengan nilai variabel lingkungan. Variabel lingkungan dapat menyimpan string koneksi lengkap dengan kredensial sensitif.

Peringatan

Variabel lingkungan umumnya disimpan dalam teks biasa dan tidak terenkripsi. Jika mesin atau proses disusupi, variabel lingkungan dapat diakses oleh pihak yang tidak tepercaya. Langkah-langkah tambahan untuk mencegah pengungkapan rahasia pengguna mungkin diperlukan.

Pemisah : tidak berfungsi dengan kunci hierarki variabel lingkungan di semua platform. __, garis bawah ganda, adalah:

  • Didukung oleh semua platform. Misalnya, pemisah : tidak didukung oleh Bash, tetapi __ adalah.
  • Digantikan secara otomatis oleh :

Manajer Rahasia

Alat Secret Manager menyimpan data sensitif selama pengembangan proyek ASP.NET Core. Dalam konteks ini, sepotong data sensitif adalah rahasia aplikasi. Rahasia aplikasi disimpan di lokasi terpisah dari pohon proyek. Rahasia aplikasi dikaitkan dengan proyek tertentu atau dibagikan di beberapa proyek. Rahasia aplikasi tidak diperiksa ke kontrol sumber.

Peringatan

Alat Secret Manager tidak mengenkripsi rahasia yang disimpan dan tidak boleh diperlakukan sebagai penyimpanan tepercaya. Ini hanya untuk tujuan pengembangan. Kunci dan nilai disimpan dalam JSfile konfigurasi ON di direktori profil pengguna.

Cara kerja alat Secret Manager

Alat Secret Manager menyembunyikan detail implementasi, seperti di mana dan bagaimana nilai disimpan. Anda dapat menggunakan alat ini tanpa mengetahui detail implementasi ini. Nilai disimpan dalam JSfile ON di folder profil pengguna komputer lokal:

Jalur sistem file:

%APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.json

Di jalur file sebelumnya, ganti <user_secrets_id> dengan UserSecretsId nilai yang ditentukan dalam file proyek.

Jangan menulis kode yang bergantung pada lokasi atau format data yang disimpan dengan alat Secret Manager. Detail implementasi ini dapat berubah. Misalnya, nilai rahasia tidak dienkripsi, tetapi bisa di masa depan.

Mengaktifkan penyimpanan rahasia

Alat Secret Manager beroperasi pada pengaturan konfigurasi khusus proyek yang disimpan di profil pengguna Anda.

Alat Secret Manager menyertakan init perintah . Untuk menggunakan rahasia pengguna, jalankan perintah berikut di direktori proyek:

dotnet user-secrets init

Perintah sebelumnya menambahkan UserSecretsId elemen dalam PropertyGroup file proyek. Secara default, teks UserSecretsId dalam adalah GUID. Teks dalam bersifat arbitrer, tetapi unik untuk proyek.

<PropertyGroup>
  <TargetFramework>netcoreapp3.1</TargetFramework>
  <UserSecretsId>79a3edd0-2092-40a2-a04d-dcb46d5ca9ed</UserSecretsId>
</PropertyGroup>

Di Visual Studio, klik kanan proyek di Penjelajah Solusi, dan pilih Kelola Rahasia Pengguna dari menu konteks. Gerakan ini menambahkan UserSecretsId elemen, diisi dengan GUID, ke file proyek.

Menetapkan rahasia

Tentukan rahasia aplikasi yang terdiri dari kunci dan nilainya. Rahasia dikaitkan dengan nilai proyek UserSecretsId . Misalnya, jalankan perintah berikut dari direktori tempat file proyek ada:

dotnet user-secrets set "Movies:ServiceApiKey" "12345"

Dalam contoh sebelumnya, titik dua menunjukkan bahwa Movies merupakan objek harfiah dengan ServiceApiKey properti .

Alat Secret Manager juga dapat digunakan dari direktori lain. --project Gunakan opsi untuk menyediakan jalur sistem file tempat file proyek berada. Contohnya:

dotnet user-secrets set "Movies:ServiceApiKey" "12345" --project "C:\apps\WebApp1\src\WebApp1"

JSStruktur ON meratakan di Visual Studio

Gerakan Kelola Rahasia Pengguna Visual Studio membuka secrets.json file di editor teks. Ganti konten secrets.json dengan pasangan kunci-nilai yang akan disimpan. Contohnya:

{
  "Movies": {
    "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
    "ServiceApiKey": "12345"
  }
}

Struktur JSON diratakan setelah modifikasi melalui dotnet user-secrets remove atau dotnet user-secrets set. Misalnya, menjalankan dotnet user-secrets remove "Movies:ConnectionString" akan menciutkan Movies objek literal. File yang dimodifikasi menyerubungi ON berikut JS:

{
  "Movies:ServiceApiKey": "12345"
}

Mengatur beberapa rahasia

Batch rahasia dapat diatur dengan menyalurkan JSke set perintah . Dalam contoh berikut, input.json konten file disalurkan ke set perintah .

Buka shell perintah, dan jalankan perintah berikut:

type .\input.json | dotnet user-secrets set

Mengakses rahasia

Untuk mengakses rahasia, selesaikan langkah-langkah berikut:

  1. Mendaftarkan sumber konfigurasi rahasia pengguna
  2. Membaca rahasia melalui API Konfigurasi

Mendaftarkan sumber konfigurasi rahasia pengguna

Penyedia konfigurasi rahasia pengguna mendaftarkan sumber konfigurasi yang sesuai dengan .NET Configuration API.

ASP.NET Core web yang dibuat dengan dotnet baru atau Visual Studio menghasilkan kode berikut:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.Run();

WebApplication.CreateBuilder menginisialisasi instans WebApplicationBuilder baru kelas dengan default yang telah dikonfigurasi sebelumnya. Inisialisasi WebApplicationBuilderAddUserSecrets (builder) menyediakan konfigurasi dan panggilan default ketika EnvironmentName adalah Development:

Membaca rahasia melalui API Konfigurasi

Pertimbangkan contoh membaca Movies:ServiceApiKey kunci berikut:

File Program.cs:

var builder = WebApplication.CreateBuilder(args);
var movieApiKey = builder.Configuration["Movies:ServiceApiKey"];

var app = builder.Build();

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

app.Run();

Razor Model halaman halaman halaman:

public class IndexModel : PageModel
{
    private readonly IConfiguration _config;

    public IndexModel(IConfiguration config)
    {
        _config = config;
    }

    public void OnGet()
    {
        var moviesApiKey = _config["Movies:ServiceApiKey"];

        // call Movies service with the API key
    }
}

Untuk informasi selengkapnya, lihat Konfigurasi di ASP.NET Core.

Memetakan rahasia ke POCO

Memetakan seluruh objek literal ke POCO (kelas .NET sederhana dengan properti) berguna untuk menggabungkan properti terkait.

Asumsikan file aplikasi secrets.json berisi dua rahasia berikut:

{
  "Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
  "Movies:ServiceApiKey": "12345"
}

Untuk memetakan rahasia sebelumnya ke POCO, gunakan fitur pengikatan grafik objek .NET Configuration API. Kode berikut mengikat ke POCO kustom MovieSettings dan mengakses ServiceApiKey nilai properti:

var moviesConfig = 
    Configuration.GetSection("Movies").Get<MovieSettings>();
_moviesApiKey = moviesConfig.ServiceApiKey;

Rahasia Movies:ConnectionString dan Movies:ServiceApiKey dipetakan ke properti masing-masing di MovieSettings:

public class MovieSettings
{
    public string ConnectionString { get; set; }

    public string ServiceApiKey { get; set; }
}

Penggantian string dengan rahasia

Menyimpan kata sandi dalam teks biasa tidak aman. Misalnya, string koneksi database yang disimpan mungkin appsettings.json menyertakan kata sandi untuk pengguna yang ditentukan:

{
  "ConnectionStrings": {
    "Movies": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;User Id=johndoe;Password=pass123;MultipleActiveResultSets=true"
  }
}

Pendekatan yang lebih aman adalah menyimpan kata sandi sebagai rahasia. Contohnya:

dotnet user-secrets set "DbPassword" "pass123"

Password Hapus pasangan kunci-nilai dari string koneksi di appsettings.json. Contohnya:

{
  "ConnectionStrings": {
    "Movies": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;User Id=johndoe;MultipleActiveResultSets=true"
  }
}

Nilai rahasia dapat diatur pada SqlConnectionStringBuilder properti objek Password untuk menyelesaikan string koneksi:

using System.Data.SqlClient;

var builder = WebApplication.CreateBuilder(args);

var conStrBuilder = new SqlConnectionStringBuilder(
        builder.Configuration.GetConnectionString("Movies"));
conStrBuilder.Password = builder.Configuration["DbPassword"];
var connection = conStrBuilder.ConnectionString;

var app = builder.Build();

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

app.Run();

Mencantumkan rahasia

Asumsikan file aplikasi secrets.json berisi dua rahasia berikut:

{
  "Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
  "Movies:ServiceApiKey": "12345"
}

Jalankan perintah berikut dari direktori tempat file proyek ada:

dotnet user-secrets list

Output berikut muncul:

Movies:ConnectionString = Server=(localdb)\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true
Movies:ServiceApiKey = 12345

Dalam contoh sebelumnya, titik dua dalam nama kunci menunjukkan hierarki objek dalam secrets.json.

Menghapus satu rahasia

Asumsikan file aplikasi secrets.json berisi dua rahasia berikut:

{
  "Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
  "Movies:ServiceApiKey": "12345"
}

Jalankan perintah berikut dari direktori tempat file proyek ada:

dotnet user-secrets remove "Movies:ConnectionString"

File aplikasi secrets.json dimodifikasi untuk menghapus pasangan kunci-nilai yang terkait dengan MoviesConnectionString kunci:

{
  "Movies": {
    "ServiceApiKey": "12345"
  }
}

dotnet user-secrets list menampilkan pesan berikut:

Movies:ServiceApiKey = 12345

Menghapus semua rahasia

Asumsikan file aplikasi secrets.json berisi dua rahasia berikut:

{
  "Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
  "Movies:ServiceApiKey": "12345"
}

Jalankan perintah berikut dari direktori tempat file proyek ada:

dotnet user-secrets clear

Semua rahasia pengguna untuk aplikasi telah dihapus dari secrets.json file:

{}

Menjalankan dotnet user-secrets list menampilkan pesan berikut:

No secrets configured for this application.

Mengelola rahasia pengguna dengan Visual Studio

Untuk mengelola rahasia pengguna di Visual Studio, klik kanan proyek di penjelajah solusi dan pilih Kelola Rahasia Pengguna:

Visual Studio memperlihatkan Kelola Rahasia Pengguna

Sumber Daya Tambahan:

Oleh Rick Anderson, Kirk Larkin, Daniel Roth, dan Scott Addie

Melihat atau mengunduh kode sampel (cara mengunduh)

Dokumen ini menjelaskan cara mengelola data sensitif untuk aplikasi ASP.NET Core pada komputer pengembangan. Jangan pernah menyimpan kata sandi atau data sensitif lainnya dalam kode sumber. Rahasia produksi tidak boleh digunakan untuk pengembangan atau pengujian. Rahasia tidak boleh disebarkan dengan aplikasi. Sebaliknya, rahasia produksi harus diakses melalui cara yang dikontrol seperti variabel lingkungan atau Azure Key Vault. Anda dapat menyimpan dan melindungi rahasia pengujian dan produksi Azure dengan penyedia konfigurasi Azure Key Vault.

Variabel lingkungan

Variabel lingkungan digunakan untuk menghindari penyimpanan rahasia aplikasi dalam kode atau dalam file konfigurasi lokal. Variabel lingkungan mengambil alih nilai konfigurasi untuk semua sumber konfigurasi yang ditentukan sebelumnya.

Pertimbangkan aplikasi web ASP.NET Core tempat keamanan Akun Pengguna Individu diaktifkan. String koneksi database default disertakan dalam file proyek appsettings.json dengan kunci DefaultConnection. String koneksi default adalah untuk LocalDB, yang berjalan dalam mode pengguna dan tidak memerlukan kata sandi. Selama penyebaran aplikasi, DefaultConnection nilai kunci dapat ditimpa dengan nilai variabel lingkungan. Variabel lingkungan dapat menyimpan string koneksi lengkap dengan kredensial sensitif.

Peringatan

Variabel lingkungan umumnya disimpan dalam teks biasa dan tidak terenkripsi. Jika mesin atau proses disusupi, variabel lingkungan dapat diakses oleh pihak yang tidak tepercaya. Langkah-langkah tambahan untuk mencegah pengungkapan rahasia pengguna mungkin diperlukan.

Pemisah : tidak berfungsi dengan kunci hierarki variabel lingkungan di semua platform. __, garis bawah ganda, adalah:

  • Didukung oleh semua platform. Misalnya, pemisah : tidak didukung oleh Bash, tetapi __ adalah.
  • Digantikan secara otomatis oleh :

Manajer Rahasia

Alat Secret Manager menyimpan data sensitif selama pengembangan proyek ASP.NET Core. Dalam konteks ini, sepotong data sensitif adalah rahasia aplikasi. Rahasia aplikasi disimpan di lokasi terpisah dari pohon proyek. Rahasia aplikasi dikaitkan dengan proyek tertentu atau dibagikan di beberapa proyek. Rahasia aplikasi tidak diperiksa ke kontrol sumber.

Peringatan

Alat Secret Manager tidak mengenkripsi rahasia yang disimpan dan tidak boleh diperlakukan sebagai penyimpanan tepercaya. Ini hanya untuk tujuan pengembangan. Kunci dan nilai disimpan dalam JSfile konfigurasi ON di direktori profil pengguna.

Cara kerja alat Secret Manager

Alat Secret Manager menyembunyikan detail implementasi, seperti di mana dan bagaimana nilai disimpan. Anda dapat menggunakan alat ini tanpa mengetahui detail implementasi ini. Nilai disimpan dalam JSfile ON di folder profil pengguna komputer lokal:

Jalur sistem file:

%APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.json

Di jalur file sebelumnya, ganti <user_secrets_id> dengan UserSecretsId nilai yang ditentukan dalam file proyek.

Jangan menulis kode yang bergantung pada lokasi atau format data yang disimpan dengan alat Secret Manager. Detail implementasi ini dapat berubah. Misalnya, nilai rahasia tidak dienkripsi, tetapi bisa di masa depan.

Mengaktifkan penyimpanan rahasia

Alat Secret Manager beroperasi pada pengaturan konfigurasi khusus proyek yang disimpan di profil pengguna Anda.

Alat Secret Manager menyertakan perintah di .NET Core SDK 3.0.100 atau yang init lebih baru. Untuk menggunakan rahasia pengguna, jalankan perintah berikut di direktori proyek:

dotnet user-secrets init

Perintah sebelumnya menambahkan UserSecretsId elemen dalam PropertyGroup file proyek. Secara default, teks UserSecretsId dalam adalah GUID. Teks dalam bersifat arbitrer, tetapi unik untuk proyek.

<PropertyGroup>
  <TargetFramework>netcoreapp3.1</TargetFramework>
  <UserSecretsId>79a3edd0-2092-40a2-a04d-dcb46d5ca9ed</UserSecretsId>
</PropertyGroup>

Di Visual Studio, klik kanan proyek di Penjelajah Solusi, dan pilih Kelola Rahasia Pengguna dari menu konteks. Gerakan ini menambahkan UserSecretsId elemen, diisi dengan GUID, ke file proyek.

Menetapkan rahasia

Tentukan rahasia aplikasi yang terdiri dari kunci dan nilainya. Rahasia dikaitkan dengan nilai proyek UserSecretsId . Misalnya, jalankan perintah berikut dari direktori tempat file proyek ada:

dotnet user-secrets set "Movies:ServiceApiKey" "12345"

Dalam contoh sebelumnya, titik dua menunjukkan bahwa Movies merupakan objek harfiah dengan ServiceApiKey properti .

Alat Secret Manager juga dapat digunakan dari direktori lain. --project Gunakan opsi untuk menyediakan jalur sistem file tempat file proyek berada. Contohnya:

dotnet user-secrets set "Movies:ServiceApiKey" "12345" --project "C:\apps\WebApp1\src\WebApp1"

JSStruktur ON meratakan di Visual Studio

Gerakan Kelola Rahasia Pengguna Visual Studio membuka secrets.json file di editor teks. Ganti konten secrets.json dengan pasangan kunci-nilai yang akan disimpan. Contohnya:

{
  "Movies": {
    "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
    "ServiceApiKey": "12345"
  }
}

Struktur JSON diratakan setelah modifikasi melalui dotnet user-secrets remove atau dotnet user-secrets set. Misalnya, menjalankan dotnet user-secrets remove "Movies:ConnectionString" akan menciutkan Movies objek literal. File yang dimodifikasi menyerubungi ON berikut JS:

{
  "Movies:ServiceApiKey": "12345"
}

Mengatur beberapa rahasia

Batch rahasia dapat diatur dengan menyalurkan JSke set perintah . Dalam contoh berikut, input.json konten file disalurkan ke set perintah .

Buka shell perintah, dan jalankan perintah berikut:

type .\input.json | dotnet user-secrets set

Mengakses rahasia

Untuk mengakses rahasia, selesaikan langkah-langkah berikut:

  1. Mendaftarkan sumber konfigurasi rahasia pengguna
  2. Membaca rahasia melalui API Konfigurasi

Mendaftarkan sumber konfigurasi rahasia pengguna

Penyedia konfigurasi rahasia pengguna mendaftarkan sumber konfigurasi yang sesuai dengan .NET Configuration API.

Sumber konfigurasi rahasia pengguna secara otomatis ditambahkan dalam mode Pengembangan saat proyek memanggil CreateDefaultBuilder. CreateDefaultBuilderAddUserSecrets memanggil ketika EnvironmentName adalah Development:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

Saat CreateDefaultBuilder tidak dipanggil, tambahkan sumber konfigurasi rahasia pengguna secara eksplisit dengan memanggil AddUserSecrets di ConfigureAppConfiguration. Panggil AddUserSecrets hanya saat aplikasi berjalan di lingkungan Pengembangan, seperti yang ditunjukkan dalam contoh berikut:

public class Program
{
    public static void Main(string[] args)
    {
        var host = new HostBuilder()
            .ConfigureAppConfiguration((hostContext, builder) =>
            {
                // Add other providers for JSON, etc.

                if (hostContext.HostingEnvironment.IsDevelopment())
                {
                    builder.AddUserSecrets<Program>();
                }
            })
            .Build();
        
        host.Run();
    }
}

Membaca rahasia melalui API Konfigurasi

Jika sumber konfigurasi rahasia pengguna terdaftar, .NET Configuration API dapat membaca rahasia. Injeksi konstruktor dapat digunakan untuk mendapatkan akses ke .NET Configuration API. Pertimbangkan contoh membaca Movies:ServiceApiKey kunci berikut:

Kelas startup:

public class Startup
{
    private string _moviesApiKey = null;

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        _moviesApiKey = Configuration["Movies:ServiceApiKey"];
    }

    public void Configure(IApplicationBuilder app)
    {
        app.Run(async (context) =>
        {
            var result = string.IsNullOrEmpty(_moviesApiKey) ? "Null" : "Not Null";
            await context.Response.WriteAsync($"Secret is {result}");
        });
    }
}

Razor Model halaman halaman halaman:

public class IndexModel : PageModel
{
    private readonly IConfiguration _config;

    public IndexModel(IConfiguration config)
    {
        _config = config;
    }

    public void OnGet()
    {
        var moviesApiKey = _config["Movies:ServiceApiKey"];

        // call Movies service with the API key
    }
}

Untuk informasi selengkapnya, lihat Konfigurasi akses di konfigurasi Startup dan Access di Razor Pages.

Memetakan rahasia ke POCO

Memetakan seluruh objek literal ke POCO (kelas .NET sederhana dengan properti) berguna untuk menggabungkan properti terkait.

Asumsikan file aplikasi secrets.json berisi dua rahasia berikut:

{
  "Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
  "Movies:ServiceApiKey": "12345"
}

Untuk memetakan rahasia sebelumnya ke POCO, gunakan fitur pengikatan grafik objek .NET Configuration API. Kode berikut mengikat ke POCO kustom MovieSettings dan mengakses ServiceApiKey nilai properti:

var moviesConfig = 
    Configuration.GetSection("Movies").Get<MovieSettings>();
_moviesApiKey = moviesConfig.ServiceApiKey;

Rahasia Movies:ConnectionString dan Movies:ServiceApiKey dipetakan ke properti masing-masing di MovieSettings:

public class MovieSettings
{
    public string ConnectionString { get; set; }

    public string ServiceApiKey { get; set; }
}

Penggantian string dengan rahasia

Menyimpan kata sandi dalam teks biasa tidak aman. Misalnya, string koneksi database yang disimpan mungkin appsettings.json menyertakan kata sandi untuk pengguna yang ditentukan:

{
  "ConnectionStrings": {
    "Movies": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;User Id=johndoe;Password=pass123;MultipleActiveResultSets=true"
  }
}

Pendekatan yang lebih aman adalah menyimpan kata sandi sebagai rahasia. Contohnya:

dotnet user-secrets set "DbPassword" "pass123"

Password Hapus pasangan kunci-nilai dari string koneksi di appsettings.json. Contohnya:

{
  "ConnectionStrings": {
    "Movies": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;User Id=johndoe;MultipleActiveResultSets=true"
  }
}

Nilai rahasia dapat diatur pada SqlConnectionStringBuilder properti objek Password untuk menyelesaikan string koneksi:

public class Startup
{
    private string _connection = null;

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        var builder = new SqlConnectionStringBuilder(
            Configuration.GetConnectionString("Movies"));
        builder.Password = Configuration["DbPassword"];
        _connection = builder.ConnectionString;

        // code omitted for brevity
    }

    public void Configure(IApplicationBuilder app)
    {
        app.Run(async (context) =>
        {
            await context.Response.WriteAsync($"DB Connection: {_connection}");
        });
    }
}

Mencantumkan rahasia

Asumsikan file aplikasi secrets.json berisi dua rahasia berikut:

{
  "Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
  "Movies:ServiceApiKey": "12345"
}

Jalankan perintah berikut dari direktori tempat file proyek ada:

dotnet user-secrets list

Output berikut muncul:

Movies:ConnectionString = Server=(localdb)\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true
Movies:ServiceApiKey = 12345

Dalam contoh sebelumnya, titik dua dalam nama kunci menunjukkan hierarki objek dalam secrets.json.

Menghapus satu rahasia

Asumsikan file aplikasi secrets.json berisi dua rahasia berikut:

{
  "Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
  "Movies:ServiceApiKey": "12345"
}

Jalankan perintah berikut dari direktori tempat file proyek ada:

dotnet user-secrets remove "Movies:ConnectionString"

File aplikasi secrets.json dimodifikasi untuk menghapus pasangan kunci-nilai yang terkait dengan MoviesConnectionString kunci:

{
  "Movies": {
    "ServiceApiKey": "12345"
  }
}

dotnet user-secrets list menampilkan pesan berikut:

Movies:ServiceApiKey = 12345

Menghapus semua rahasia

Asumsikan file aplikasi secrets.json berisi dua rahasia berikut:

{
  "Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
  "Movies:ServiceApiKey": "12345"
}

Jalankan perintah berikut dari direktori tempat file proyek ada:

dotnet user-secrets clear

Semua rahasia pengguna untuk aplikasi telah dihapus dari secrets.json file:

{}

Menjalankan dotnet user-secrets list menampilkan pesan berikut:

No secrets configured for this application.

Mengelola rahasia pengguna dengan Visual Studio

Untuk mengelola rahasia pengguna di Visual Studio, klik kanan proyek di penjelajah solusi dan pilih Kelola Rahasia Pengguna:

Visual Studio memperlihatkan Kelola Rahasia Pengguna

Sumber Daya Tambahan: