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 /secret
etmek 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ı MyTestUser
bir 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();
ASP.NET Core