Mengelola JSON Web Token dalam pengembangan dengan dotnet user-jwts
Oleh Rick Anderson
Alat dotnet user-jwts
baris perintah dapat membuat dan mengelola JSON Web Token (JWTs) lokal aplikasi tertentu.
Sinopsis
dotnet user-jwts [<PROJECT>] [command]
dotnet user-jwts [command] -h|--help
Deskripsi
Membuat dan mengelola Token Web JSON lokal proyek tertentu.
Argumen
PROJECT | SOLUTION
Proyek MSBuild untuk menerapkan perintah. Jika proyek tidak ditentukan, MSBuild mencari direktori kerja saat ini untuk file yang memiliki ekstensi file yang berakhiran proj dan menggunakan file tersebut.
Perintah
Perintah | Deskripsi |
---|---|
hapus | Hapus semua JWT yang dikeluarkan untuk proyek. |
buat | Terbitkan JSON Web Token baru. |
buka | Menghapus JWT tertentu. |
kunci | Menampilkan atau mengatur ulang kunci penandatanganan yang digunakan untuk menerbitkan JWT. |
list | Mencantumkan JWT yang dikeluarkan untuk proyek. |
cetak | Menampilkan detail JWT tertentu. |
Buat
Penggunaan: dotnet user-jwts create [options]
Opsi | Deskripsi |
---|---|
-p | --proyek | Jalur proyek yang akan dioperasikan. Default ke proyek di direktori saat ini. |
--skema | Nama skema yang digunakan untuk token yang dihasilkan. Default ke 'Pembawa'. |
-n | --Nama | Nama pengguna untuk membuat JWT. Default ke pengguna lingkungan saat ini. |
--penonton | Audiens untuk membuat JWT. Default ke URL yang dikonfigurasi dalam launchSettings.json proyek. |
--Penerbit | Penerbit JWT. Default ke 'dotnet-user-jwts'. |
--scope | Klaim cakupan untuk ditambahkan ke JWT. Tentukan sekali untuk setiap cakupan. |
--role | Klaim peran untuk ditambahkan ke JWT. Tentukan sekali untuk setiap peran. |
--klaim | Klaim untuk ditambahkan ke JWT. Tentukan sekali untuk setiap klaim dalam format "name=value". |
--not-before | Tanggal UTC & waktu JWT tidak boleh valid sebelumnya dalam format 'yyyy-MM-dd [[HH:mm[[:ss]]]]]'. Default ke tanggal & waktu JWT dibuat. |
--expires-on | Tanggal UTC & waktu JWT harus kedaluwarsa dalam format 'yyyy-MM-dd [[[ [HH:mm]:ss]]'. Default ke 6 bulan setelah tanggal --not-before. Jangan gunakan opsi ini bersama dengan opsi --valid-for. |
--valid-for | Periode JWT harus kedaluwarsa setelahnya. Tentukan menggunakan angka diikuti dengan jenis durasi seperti 'd' selama hari, 'h' selama berjam-jam, 'm' selama menit, dan 's' selama detik, misalnya 365d'. Jangan gunakan opsi ini bersama dengan opsi --expires-on. |
-o | --hasil | Format yang digunakan untuk menampilkan output dari perintah. Bisa menjadi salah satu dari 'default', 'token', atau 'json'. |
-h | --Tolong | Perlihatkan informasi bantuan |
Contoh
Jalankan perintah berikut untuk membuat proyek web kosong dan tambahkan paket NuGet Microsoft.AspNetCore.Authentication.JwtBearer :
dotnet new web -o MyJWT
cd MyJWT
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
Ganti isi Program.cs
dengan kode berikut:
using System.Security.Claims;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddAuthorization();
builder.Services.AddAuthentication("Bearer").AddJwtBearer();
var app = builder.Build();
app.UseAuthorization();
app.MapGet("/", () => "Hello, World!");
app.MapGet("/secret", (ClaimsPrincipal user) => $"Hello {user.Identity?.Name}. My secret")
.RequireAuthorization();
app.Run();
Dalam kode sebelumnya, permintaan GET untuk /secret
mengembalikan kesalahan 401 Unauthorized
. Aplikasi produksi mungkin mendapatkan JWT dari layanan token Keamanan (STS), mungkin sebagai respons terhadap masuk melalui serangkaian kredensial. Untuk tujuan bekerja dengan API selama pengembangan lokal, dotnet user-jwts
alat baris perintah dapat digunakan untuk membuat dan mengelola JWT lokal khusus aplikasi.
Alat user-jwts
ini mirip dalam konsep dengan alat rahasia pengguna, alat ini dapat digunakan untuk mengelola nilai untuk aplikasi yang hanya valid untuk pengembang di komputer lokal. Bahkan, alat user-jwts menggunakan user-secrets
infrastruktur untuk mengelola kunci yang ditandatangani JWT, memastikannya disimpan dengan aman di profil pengguna.
Alat ini user-jwts
menyembunyikan detail implementasi, seperti di mana dan bagaimana nilai disimpan. Alat ini dapat digunakan tanpa mengetahui detail implementasinya. Nilai disimpan dalam file JSON di folder profil pengguna komputer lokal:
Jalur sistem file:
%APPDATA%\Microsoft\UserSecrets\<secrets_GUID>\user-jwts.json
Membuat JWT
Perintah berikut membuat JWT lokal:
dotnet user-jwts create
Perintah sebelumnya membuat JWT dan memperbarui file proyek appsettings.Development.json
dengan JSON yang mirip dengan yang berikut ini:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"Authentication": {
"Schemes": {
"Bearer": {
"ValidAudiences": [
"http://localhost:8401",
"https://localhost:44308",
"http://localhost:5182",
"https://localhost:7076"
],
"ValidIssuer": "dotnet-user-jwts"
}
}
}
}
Salin JWT dan yang ID
dibuat di perintah sebelumnya. Gunakan alat seperti Curl untuk menguji /secret
:
curl -i -H "Authorization: Bearer {token}" https://localhost:{port}/secret
Di mana {token}
adalah JWT yang dihasilkan sebelumnya.
Menampilkan informasi keamanan JWT
Perintah berikut menampilkan informasi keamanan JWT, termasuk kedaluwarsa, cakupan, peran, header token dan payload, dan token ringkas:
dotnet user-jwts print {ID} --show-all
Membuat token untuk pengguna dan cakupan tertentu
Lihat Membuat dalam topik ini untuk opsi pembuatan yang didukung.
Perintah berikut membuat JWT untuk pengguna bernama MyTestUser
:
dotnet user-jwts create --name MyTestUser --scope "myapi:secrets"
Perintah sebelumnya memiliki output yang mirip dengan yang berikut ini:
New JWT saved with ID '43e0b748'.
Name: MyTestUser
Scopes: myapi:secrets
Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.{Remaining token deleted}
Token sebelumnya dapat digunakan untuk menguji /secret2
titik akhir dalam kode berikut:
using System.Security.Claims;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddAuthorization();
builder.Services.AddAuthentication("Bearer").AddJwtBearer();
var app = builder.Build();
app.MapGet("/", () => "Hello, World!");
app.MapGet("/secret", (ClaimsPrincipal user) => $"Hello {user.Identity?.Name}. My secret")
.RequireAuthorization();
app.MapGet("/secret2", () => "This is a different secret!")
.RequireAuthorization(p => p.RequireClaim("scope", "myapi:secrets"));
app.Run();
ASP.NET Core