Mengelola JSOn Web Token dalam pengembangan dengan dotnet user-jwts

Oleh Rick Anderson

Alat dotnet user-jwts baris perintah dapat membuat dan mengelola On Web Token lokal (JWT) khusus JSaplikasi.

Sinopsis

dotnet user-jwts [<PROJECT>] [command]
dotnet user-jwts [command] -h|--help

Deskripsi

Membuat dan mengelola Token Web LOKAL lokal JSproyek 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 Token Web ON baru JS.
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.

Membuat

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 peluncuran proyek Pengaturan.json.
--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' untuk hari, 'h' selama berjam-jam, 'm' selama menit, dan 's' selama detik, misalnya 365d'. Jangan gunakan opsi ini bersama dengan opsi --expires-on.
-o | --Output 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 JSfile ON 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();