Správa webových tokenů JSON ve vývoji pomocí dotnet user-jwts
Autor: Rick Anderson
Nástroj dotnet user-jwts
příkazového řádku může vytvářet a spravovat místní webové tokeny JSON specifické pro aplikaci (JWT).
Synopse
dotnet user-jwts [<PROJECT>] [command]
dotnet user-jwts [command] -h|--help
Popis
Vytvoří a spravuje místní webové tokeny JSON specifické pro projekt.
Argumenty
PROJECT | SOLUTION
Projekt MSBuild pro použití příkazu na. Pokud projekt není zadaný, nástroj MSBuild vyhledá v aktuálním pracovním adresáři soubor, který má příponu souboru končící proj a použije tento soubor.
Příkazy
Příkaz | Popis |
---|---|
jasný | Odstraňte všechny vydané JWT pro projekt. |
vytvoření | Zadejte nový webový token JSON. |
remove | Odstraňte daný JWT. |
key | Zobrazení nebo resetování podpisového klíče použitého k vydávání JWT |
list | Zobrazí seznam JWT vydaných pro projekt. |
tisknout | Zobrazí podrobnosti o daném JWT. |
Vytvoření
Použití: dotnet user-jwts create [options]
Možnost | Popis |
---|---|
-p | --projekt | Cesta projektu, na které se má pracovat. Ve výchozím nastavení je projekt v aktuálním adresáři. |
--schéma | Název schématu, který se má použít pro vygenerovaný token. Výchozí hodnota je nosná. |
-n | --Jméno | Jméno uživatele, pro který má vytvořit JWT. Výchozí hodnota je pro aktuálního uživatele prostředí. |
--obecenstvo | Cílové skupiny pro vytvoření JWT pro. Ve výchozím nastavení se nastaví adresy URL nakonfigurované v launchSettings.json projektu. |
--emitent | Vystavitel JWT. Výchozí hodnota je dotnet-user-jwts. |
--rozsah | Deklarace oboru, která se má přidat do JWT. Zadejte jednou pro každý obor. |
--role | Deklarace role, která se má přidat do JWT. Zadejte jednou pro každou roli. |
--tvrzení | Deklarace identity, které se mají přidat do JWT. Zadejte jednou pro každou deklaraci identity ve formátu name=value. |
--not-before | Datum a čas UTC, které JWT nesmí být platné před formátem rrrr-MM-dd [[HH:mm[[:ss]]]]. Výchozí hodnota je datum a čas vytvoření JWT. |
--expires-on | Datum a čas UTC by měl vypršet platnost JWT ve formátu rrrr-MM-dd [[[ [HH:mm]]:ss]'. Výchozí hodnota je 6 měsíců po datu --not-before. Tuto možnost nepoužívejte ve spojení s parametrem --valid-for. |
--valid-for | Doba, po které má JWT vypršet. Zadejte pomocí čísla následovaného typem doby trvání jako d pro dny, h pro hodiny, m pro minuty a s po sekundách, například 365d. Tuto možnost nepoužívejte ve spojení s možností --expires-on. |
-o | --výstup | Formát, který se má použít pro zobrazení výstupu z příkazu. Může to být jedna z výchozích hodnot, tokenu nebo json. |
-h | --Pomoc | Zobrazit informace nápovědy |
Příklady
Spuštěním následujících příkazů vytvořte prázdný webový projekt a přidejte balíček NuGet Microsoft.AspNetCore.Authentication.JwtBearer :
dotnet new web -o MyJWT
cd MyJWT
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
Program.cs
Obsah nahraďte následujícím kódem:
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();
V předchozím kódu požadavek GET vrátí /secret
401 Unauthorized
chybu. Produkční aplikace může získat JWT ze služby tokenů zabezpečení (STS), například v reakci na přihlášení pomocí sady přihlašovacích údajů. Pro účely práce s rozhraním API během místního vývoje dotnet user-jwts
je možné nástroj příkazového řádku použít k vytváření a správě místních JWT specifických pro aplikace.
Tento user-jwts
nástroj se podobá nástroji pro tajné kódy uživatelů, dá se použít ke správě hodnot pro aplikaci, které jsou platné jenom pro vývojáře na místním počítači. Nástroj user-jwts ve skutečnosti využívá infrastrukturu user-secrets
ke správě klíče, kterým jsou podpisy JWT, a zajišťuje bezpečné uložení v profilu uživatele.
Nástroj user-jwts
skryje podrobnosti implementace, například kde a jak se hodnoty ukládají. Nástroj lze použít bez znalosti podrobností implementace. Hodnoty se ukládají do souboru JSON ve složce profilu uživatele místního počítače:
Cesta k systému souborů:
%APPDATA%\Microsoft\UserSecrets\<secrets_GUID>\user-jwts.json
Vytvoření JWT
Následující příkaz vytvoří místní JWT:
dotnet user-jwts create
Předchozí příkaz vytvoří JWT a aktualizuje soubor projektu appsettings.Development.json
pomocí formátu JSON podobný následujícímu:
{
"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"
}
}
}
}
Zkopírujte JWT a ID
vytvořený v předchozím příkazu. K otestování /secret
použijte nástroj, jako je Curl:
curl -i -H "Authorization: Bearer {token}" https://localhost:{port}/secret
Kde {token}
je dříve vygenerovaný JWT.
Zobrazení informací o zabezpečení JWT
Následující příkaz zobrazí informace o zabezpečení JWT, včetně vypršení platnosti, oborů, rolí, hlavičky tokenu a datové části a kompaktního tokenu:
dotnet user-jwts print {ID} --show-all
Vytvoření tokenu pro konkrétního uživatele a obor
Podporované možnosti vytváření najdete v části Vytvoření v tomto tématu.
Následující příkaz vytvoří JWT pro uživatele s názvem MyTestUser
:
dotnet user-jwts create --name MyTestUser --scope "myapi:secrets"
Předchozí příkaz má výstup podobný následujícímu:
New JWT saved with ID '43e0b748'.
Name: MyTestUser
Scopes: myapi:secrets
Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.{Remaining token deleted}
Předchozí token lze použít k otestování koncového /secret2
bodu v následujícím kódu:
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();