Mengelola token web JSON selama 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.

Artikel ini menyediakan detail sintaks untuk perintah dan contoh.

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 yang digunakan untuk menjalankan perintah. Jika proyek tidak ditentukan, MSBuild mencari direktori kerja saat ini untuk file yang memiliki ekstensi file yang berakhiran proj. Kemudian menggunakan file tersebut untuk mendapatkan informasi proyek untuk perintah .

Perintah

Perintah Deskripsi
clear Hapus semua JWT yang dikeluarkan untuk proyek.
create Terbitkan JSON Web Token baru.
remove Hapus .JWT
key Menampilkan atau mengatur ulang kunci penandatanganan yang digunakan untuk menerbitkan JWT.
list Cantumkan JWT yang dikeluarkan untuk proyek.
print Tampilkan detail dari JWT.

Opsi untuk perintah buat

Penggunaan: dotnet user-jwts create [options]

Opsi Deskripsi
-p \| --project Jalur proyek yang akan dioperasikan. Secara default menggunakan proyek di direktori saat ini.
--scheme Nama skema yang digunakan untuk token yang dihasilkan. Secara default menjadi Bearer.
-n \| --name Nama pengguna yang akan dibuat JWT . Default ke pengguna lingkungan saat ini.
--audience Audiens yang akan dibuat untuknya JWT . Secara default, menggunakan URL yang dikonfigurasi dalam file launchSettings.json proyek.
--issuer Penerbit JWT. Secara default menjadi 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.
--claim Klaim untuk ditambahkan ke JWT. Tentukan sekali untuk setiap klaim dalam format name=value.
--not-before Tanggal dan waktu UTC di mana JWT menjadi valid, dalam format yyyy-MM-dd [[HH:mm[[:ss]]]]. Default ke tanggal dan waktu JWT dibuat.
--expires-on Tanggal dan waktu UTC di mana kedaluwarsa JWT , dalam format yyyy-MM-dd [[[ [HH:mm]]:ss]]. Secara default, enam bulan setelah tanggal --not-before. Jangan gunakan opsi ini dengan opsi --valid-for.
--valid-for Jumlah waktu tetap JWT valid. Ketika waktu tercapai, kedaluwarsa JWT . Tentukan angka diikuti dengan jenis durasi (d hari, jam, hm menit, s detik), seperti 365d. Jangan gunakan opsi ini dengan opsi --expires-on.
-o \| --output Format yang digunakan untuk menampilkan output dari perintah: default, , tokenatau json.
-h \| --help Tampilkan informasi bantuan untuk perintah.

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 konten file 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 ke endpoint /secret mengembalikan error 401 Unauthorized. Aplikasi produksi mungkin mendapatkan JWT dari layanan token Keamanan, mungkin sebagai respons terhadap masuk dengan kredensial. Saat Anda menggunakan 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 . Ini dapat digunakan untuk mengelola nilai untuk aplikasi yang hanya valid untuk pengembang di komputer lokal. Bahkan, alat user-jwts ini memanfaatkan infrastruktur user-secrets untuk mengelola kunci yang digunakan untuk menandatangani JWT. Pendekatan ini memastikan kunci 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:

  • Windows: %APPDATA%\Microsoft\UserSecrets<secrets_GUID>\user-jwts.jsaktif

  • Linux/macOS: ~/.microsoft/usersecrets/<secrets_GUID>/user-jwts.json

Membuat JWT

Perintah berikut membuat lokal JWT:

dotnet user-jwts create

Perintah sebelumnya membuat JWT dan memperbarui file proyek appsettings.Development.json dengan JSON yang mirip dengan contoh berikut:

{
  "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"
      }
    }
  }
}

JWT Salin dan yang ID dibuat dalam perintah sebelumnya. Gunakan alat seperti Curl untuk menguji /secret titik akhir, di mana {token} adalah yang dihasilkan JWTsebelumnya :

curl -i -H "Authorization: Bearer {token}" https://localhost:{port}/secret

Menampilkan JWT informasi keamanan

Perintah berikut menampilkan informasi keamanan, termasuk kedaluwarsa JWT , cakupan, peran, header token dan payload, dan token ringkas:

dotnet user-jwts print {ID} --show-all

Membuat token untuk pengguna dan cakupan tertentu

Perintah berikut membuat JWT untuk pengguna bernama MyTestUser. Untuk opsi yang didukung create , lihat bagian Opsi untuk perintah buat .

dotnet user-jwts create --name MyTestUser --scope "myapi:secrets"

Perintah sebelumnya memiliki output yang mirip dengan contoh berikut:

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();