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

Yazan Rick Anderson

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

Bu makalede, komut ve örnekler için söz dizimi ayrıntıları sağlanır.

Ö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.

Argümanlar

PROJECT | SOLUTION

Komutun uygulanacağı MSBuild projesi. Bir proje belirtilmezse, MSBuild geçerli çalışma dizininde proj ile biten dosya uzantısına sahip bir dosya arar. Ardından bu dosyayı kullanarak komutun proje bilgilerini alır.

Komutlar

Komut Açıklama
clear Bir proje için verilen tüm JWT'leri silin.
create Yeni bir JSON Web Belirteci gönderin.
remove Belirli JWTbir öğesini silin.
key JWT'leri vermek için kullanılan imzalama anahtarını görüntüleyin veya sıfırlayın.
list Proje için verilen JWT'leri listeleyin.
print Belirli JWTbir öğesinin ayrıntılarını görüntüleyin.

Create komutu için seçenekler

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

Seçenek Açıklama
-p \| --project Üzerinde çalışacak projenin yolu. Varsayılan olarak geçerli dizindeki projeyi seçer.
--scheme Oluşturulan belirteç için kullanılacak şema adı. Varsayılan olarak Bearer değerini alır.
-n \| --name Oluşturulacak JWT kullanıcının adı. Varsayılan olarak geçerli ortam kullanıcısını kullanır.
--audience Oluşturulacak JWT hedef kitleler. Projenin launchSettings.json dosyasında yapılandırılan URL'leri varsayılan olarak kullanır.
--issuer verenidir JWT. Varsayılan olarak dotnet-user-jwts değerini alır.
--scope öğesine eklenecek JWTbir kapsam talebi. Her kapsam için bir kez belirtin.
--role öğesine eklenecek JWTbir rol talebi. Her rol için bir kez belirtin.
--claim öğesine eklenecek talepler JWT. Her talep için name=value biçiminde bir kez belirtin.
--not-before biçiminde geçerli yyyy-MM-dd [[HH:mm[[:ss]]]]olduğu UTC tarihi ve saatiJWT. Varsayılan olarak oluşturulduğu tarih ve saat değeridir JWT .
--expires-on UTC tarihi ve saati JWT , biçiminde yyyy-MM-dd [[[ [HH:mm]]:ss]]sona erer. Varsayılan olarak, --not-before tarihinden altı ay sonrasıdır. Bu seçeneği --valid-for seçeneğiyle kullanmayın.
--valid-for Geçerli kalan süre JWT . Süreye ulaşıldığında süresi JWT dolar. Bir sayıyı ve ardından süre türünü (d gün, saat, hm dakika, s saniye) (gibi 365d) belirtin. Bu seçeneği --expires-on seçeneğiyle kullanmayın.
-o \| --output Komutundan çıktı görüntülemek için kullanılacak biçim: default, tokenveya json.
-h \| --help Komutun yardım bilgilerini gösterin.

Ö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

Program.cs dosyasının içeriğini 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, uç noktaya yönelik /secret bir GET isteği bir 401 Unauthorized hata döndürür. Bir üretim uygulaması, kimlik bilgileriyle oturum açmaya yanıt olarak bir Güvenlik belirteci hizmetinden alabilirJWT. Api'yi yerel geliştirme sırasında kullandığınızda, dotnet user-jwts uygulamaya özgü yerel JWT'ler oluşturmak ve yönetmek için komut satırı aracı kullanılabilir.

user-jwts aracı, kavramsal olarak user-secrets 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 imzalanmasında kullanılan anahtarı yönetmek için user-secrets altyapısından yararlanır. Bu yaklaşım anahtarın 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:

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

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

Bir JWT oluştur

Aşağıdaki komut yerel JWTbir oluşturur:

dotnet user-jwts create

Yukarıdaki komut bir oluşturur JWT ve proje appsettings.Development.json dosyasını aşağıdaki örneğe 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"
      }
    }
  }
}

JWT önceki komutta ID oluşturulan ve öğesini kopyalayın. Daha önce oluşturulan JWTuç noktayı {token} test /secret etmek için Curl gibi bir araç kullanın:

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

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

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

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

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

Aşağıdaki komut adlı MyTestUserbir kullanıcı için bir JWT oluşturur. Desteklenen create seçenekler için komut oluşturma seçenekleri bölümüne bakın.

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

Yukarıdaki komutun çıktısı aşağıdaki örneğe benzer:

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

Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.{Remaining token deleted}

Yukarıdaki belirteç, aşağıdaki kodda /secret2 uç noktasını test 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();