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

Tento článek obsahuje podrobnosti syntaxe pro příkaz a příklady.

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, na který se má použít příkaz. 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. Potom tento soubor použije k získání informací o projektu pro příkaz.

Příkazy

Příkaz Popis
clear Odstraňte všechny vydané JWT pro projekt.
create Zadejte nový webový token JSON.
remove Odstranění daného JWTobjektu .
key Zobrazení nebo resetování podpisového klíče použitého k vydávání JWT
list Uveďte seznam JWT vydaných pro projekt.
print Zobrazí podrobnosti daného JWTsouboru .

Možnosti příkazu create

Použití: dotnet user-jwts create [options]

Možnost Popis
-p \| --project Cesta projektu, na které se má pracovat. Ve výchozím nastavení se použije projekt v aktuálním adresáři.
--scheme Název schématu, který se má použít pro vygenerovaný token. Výchozí hodnota je Bearer.
-n \| --name Jméno uživatele, pro který se má vytvořit JWT . Výchozí hodnota je pro aktuálního uživatele prostředí.
--audience Cílové skupiny, pro které se mají JWT vytvořit. Výchozí hodnota je adresa URL nakonfigurovaná v souboru launchSettings.json projektu.
--issuer Vystavitel JWT. Výchozí hodnota je dotnet-user-jwts.
--scope Deklarace oboru, která se má přidat do objektu JWT. Zadejte jednou pro každý obor.
--role Deklarace role, která se má přidat do objektu JWT. Zadejte jednou pro každou roli.
--claim Deklarace identity, které se mají přidat do .JWT Zadejte jednou pro každý claim ve formátu name=value.
--not-before Datum a čas UTC, JWT kdy se stane platným, ve formátu yyyy-MM-dd [[HH:mm[[:ss]]]]. Výchozí hodnota je datum a čas vytvoření JWT .
--expires-on Datum a čas UTC, kdy JWT vyprší platnost, ve formátu yyyy-MM-dd [[[ [HH:mm]]:ss]]. Výchozí hodnota je šest měsíců po --not-before datu. Tuto možnost nepoužívejte s možností --valid-for.
--valid-for Doba, po kterou JWT zůstane platná. Po dosažení JWT času vyprší platnost. Zadejte číslo následované typem doby trvání (d dny, h hodiny, m minuty, s sekundy), například 365d. Tuto možnost nepoužívejte s možností --expires-on.
-o \| --output Formát, který se má použít pro zobrazení výstupu z příkazu: default, tokennebo json.
-h \| --help Zobrazí informace nápovědy pro příkaz.

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

Obsah souboru Program.cs 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 na /secret koncový bod vrátí 401 Unauthorized chybu. Produkční aplikace může získat JWT službu tokenů zabezpečení, například v reakci na přihlášení pomocí přihlašovacích údajů. Pokud rozhraní API používáte při místním vývoji, dotnet user-jwts můžete nástroj příkazového řádku použít k vytváření a správě místních JWT specifických pro aplikaci.

Tento user-jwts nástroj je podobný konceptu jako nástroj 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. Ve skutečnosti nástroj user-jwts využívá infrastrukturu user-secrets ke správě klíče, kterým jsou JWT podepisovány. Tento přístup zajišťuje bezpečné uložení klíče 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:

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

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

Vytvořte soubor 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ě jako v následujícím příkladu:

{
  "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 a JWT vytvořili ID v předchozím příkazu. Pomocí nástroje, jako je Curl, otestujte /secret koncový bod, kde {token} se dříve vygeneroval JWT:

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

Zobrazení JWT informací o zabezpečení

Následující příkaz zobrazí JWT informace o zabezpečení, 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

Následující příkaz vytvoří JWT pro uživatele s názvem MyTestUser. Podporované create možnosti najdete v části Možnosti pro příkaz create .

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

Předchozí příkaz má výstup podobný následujícímu příkladu:

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