dotnet user-jwts ile geliştirme aşamasında JSON Web Belirteçlerini yönetme

Gönderen Rick Anderson

Komut dotnet user-jwts satırı aracı, uygulamaya özgü yerel JSON Web Belirteçleri (JWT) oluşturabilir ve yönetebilir.

Özet

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

Açıklama

Projeye özgü yerel JSON Web Belirteçleri oluşturur ve yönetir.

Bağımsız değişkenler

PROJECT | SOLUTION

Komutun uygulanacağı MSBuild projesi. Bir proje belirtilmezse, MSBuild geçerli çalışma dizininde proj ile biten ve bu dosyayı kullanan bir dosya uzantısına sahip bir dosya arar.

Komutlar

Komut Açıklama
berrak Bir proje için verilen tüm JWT'leri silin.
oluşturmaya Yeni bir JSON Web Belirteci gönderin.
remove Belirli bir JWT'i silin.
anahtar JWT'leri vermek için kullanılan imzalama anahtarını görüntüleyin veya sıfırlayın.
listele Proje için verilen JWT'leri listeler.
yazdırmak Belirli bir JWT'nin ayrıntılarını görüntüleyin.

Oluşturma

Kullanım: dotnet user-jwts create [options]

Seçenek Açıklama
-p | --proje Üzerinde çalışacak projenin yolu. Varsayılan olarak geçerli dizindeki projeyi kullanır.
--tertip etmek Oluşturulan belirteç için kullanılacak düzen adı. Varsayılan olarak 'Taşıyıcı' olarak gösterilir.
-n | --ad JWT'nin oluşturulacağı kullanıcının adı. Varsayılan olarak geçerli ortam kullanıcısını kullanır.
--seyirci JWT'yi oluşturmak için hedef kitleler. Projenin launchSettings.json yapılandırılan URL'leri varsayılan olarak kullanır.
--Veren JWT'nin vereni. Varsayılan olarak 'dotnet-user-jwts' kullanılır.
--kapsam JWT'ye eklenecek kapsam talebi. Her kapsam için bir kez belirtin.
--rol JWT'ye eklenecek rol talebi. Her rol için bir kez belirtin.
--iddia etmek JWT'ye eklenecek talepler. Her talep için "name=value" biçiminde bir kez belirtin.
--not-before JWT'nin daha önce 'yyyy-MM-dd [[HH:mm[[:ss]]]]' biçiminde geçerli olmaması gereken UTC tarih ve saati. Varsayılan olarak JWT'nin oluşturulduğu tarih ve saat değeridir.
--expires-on JWT'nin süresinin 'y-MM-dd [[[ [SS:mm]]:ss]]' biçiminde dolması gereken UTC tarih ve saati. Varsayılan olarak --önce değil tarihinden sonraki 6 ay olarak belirlenir. Bu seçeneği --valid-for seçeneğiyle birlikte kullanmayın.
--valid-for JWT'nin sona ermesi gereken süre. Günler için 'd', saat için 'h', dakikalar için 'm' ve saniyeler için 's' gibi süre türü (örneğin 365d) kullanarak bir sayı belirtin. Bu seçeneği --expires-on seçeneğiyle birlikte kullanmayın.
-o | --çıktı Komutun çıkışını görüntülemek için kullanılacak biçim. 'default', 'token' veya 'json' olabilir.
-h | --Yardım Yardım bilgilerini göster

Örnekler

Boş bir web projesi oluşturmak ve Microsoft.AspNetCore.Authentication.JwtBearer NuGet paketini eklemek için aşağıdaki komutları çalıştırın:

dotnet new web -o MyJWT
cd MyJWT
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

öğesinin içeriğini Program.cs aşağıdaki kodla değiştirin:

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

Yukarıdaki kodda, bir GET isteği /secret bir 401 Unauthorized hata döndürür. Bir üretim uygulaması JWT'yi bir Güvenlik belirteci hizmetinden (STS) alabilir ve belki de bir kimlik bilgileri kümesi aracılığıyla oturum açma işlemine yanıt olarak. Yerel geliştirme sırasında API ile çalışmak amacıyla, dotnet user-jwts uygulamaya özgü yerel JWT'ler oluşturmak ve yönetmek için komut satırı aracı kullanılabilir.

Araç user-jwts kavram olarak kullanıcı gizli dizileri aracına benzer; uygulamanın yalnızca yerel makinedeki geliştirici için geçerli olan değerlerini yönetmek için kullanılabilir. Aslında user-jwts aracı, JWT'lerin imzalandığı anahtarı yönetmek için altyapıyı kullanır user-secrets ve kullanıcı profilinde güvenli bir şekilde depolanmasını sağlar.

Araç user-jwts , değerlerin nerede ve nasıl depolandığı gibi uygulama ayrıntılarını gizler. Araç, uygulama ayrıntıları bilinmeden kullanılabilir. Değerler yerel makinenin kullanıcı profili klasöründeki bir JSON dosyasında depolanır:

Dosya sistemi yolu:

%APPDATA%\Microsoft\UserSecrets\<secrets_GUID>\user-jwts.json

JWT oluşturma

Aşağıdaki komut yerel bir JWT oluşturur:

dotnet user-jwts create

Yukarıdaki komut bir JWT oluşturur ve projenin appsettings.Development.json dosyasını aşağıdakine benzer şekilde JSON ile güncelleştirir:

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

Önceki komutta oluşturulan JWT'yi ve ID öğesini kopyalayın. Test /secretetmek için Curl gibi bir araç kullanın:

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

Burada {token} daha önce oluşturulan JWT'dir.

JWT güvenlik bilgilerini görüntüleme

Aşağıdaki komut, süre sonu, kapsamlar, roller, belirteç üst bilgisi ve yükü ve sıkıştırılmış belirteç de dahil olmak üzere JWT güvenlik bilgilerini görüntüler:

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

Belirli bir kullanıcı ve kapsam için belirteç oluşturma

Desteklenen oluşturma seçenekleri için bu konudaki Oluşturma bölümüne bakın.

Aşağıdaki komut adlı MyTestUserbir kullanıcı için bir JWT oluşturur:

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

Yukarıdaki komut aşağıdakine benzer bir çıktıya sahiptir:

New JWT saved with ID '43e0b748'.
Name: MyTestUser
Scopes: myapi:secrets

Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.{Remaining token deleted}

Yukarıdaki belirteç, uç noktayı aşağıdaki kodda test /secret2 etmek için kullanılabilir:

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