Sdílet prostřednictvím


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í /secretpouž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();