JSON Web Tokens beheren tijdens de ontwikkeling met dotnet user-jwts

Door Rick Anderson

Het dotnet user-jwts opdrachtregelprogramma kan app-specifieke lokale JSON-webtokens (JWT's) maken en beheren.

Dit artikel bevat syntaxisdetails voor de opdracht en voorbeelden.

Samenvatting

dotnet user-jwts [<PROJECT>] [command]
dotnet user-jwts [command] -h|--help

Description

Hiermee maakt en beheert u projectspecifieke lokale JSON-webtokens.

Arguments

PROJECT | SOLUTION

Het MSBuild-project waarop een opdracht moet worden toegepast. Als een project niet is opgegeven, zoekt MSBuild in de huidige werkmap naar een bestand met een bestandsextensie die eindigt op proj. Vervolgens wordt dat bestand gebruikt om de projectgegevens voor de opdracht op te halen.

Commands

Command Description
clear Verwijder alle uitgegeven JWT's voor een project.
create Geef een nieuw JSON-webtoken op.
remove Een bepaalde JWT verwijderen.
key De ondertekeningssleutel weergeven of opnieuw instellen die wordt gebruikt om JWT's uit te geven.
list Vermeld de JWT's die voor het project zijn uitgegeven.
print De details van een bepaalde JWT weergeven.

Opties voor de create-opdracht

Gebruik: dotnet user-jwts create [options]

Optie Description
-p \| --project Het pad van het project waarop gewerkt moet worden. Wordt standaard ingesteld op het project in de huidige map.
--scheme De schemanaam die moet worden gebruikt voor het gegenereerde token. Wordt standaard ingesteld op Bearer.
-n \| --name De naam van de gebruiker waarvoor de JWT moet worden gemaakt. Standaard ingesteld op de huidige omgevingsgebruiker.
--audience De doelgroepen waarvoor de JWT moet worden gemaakt. Standaard ingesteld op de URL's die zijn geconfigureerd in het launchSettings.json-bestand van het project.
--issuer De uitgever van de JWT. Wordt standaard ingesteld op dotnet-user-jwts.
--scope Een bereikclaim die moet worden toegevoegd aan de JWT. Specificeer eenmalig voor elke scope.
--role Een rolclaim die moet worden toegevoegd aan de JWT. Geef één keer op voor elke rol.
--claim Claims die moeten worden toegevoegd aan de JWT. Specificeer dit eenmaal voor elke claim in de notatie name=value.
--not-before De UTC-datum en -tijd waarop de JWT geldig wordt, in de notatie yyyy-MM-dd [[HH:mm[[:ss]]]]. De standaardinstelling is de datum en tijd waarop de JWT wordt gemaakt.
--expires-on De UTC-datum en -tijd waarop de JWT verloopt, in de notatie yyyy-MM-dd [[[ [HH:mm]]:ss]]. De standaardwaarde is zes maanden na de --not-before datum. Gebruik deze optie niet met de optie --valid-for.
--valid-for Hoe lang de JWT geldig blijft. Zodra het ingestelde tijdstip is bereikt, verloopt de JWT. Geef een getal op gevolgd door het duurtype (dagen, d uren, h minuten, m seconden), zoals s.365d Gebruik deze optie niet met de optie --expires-on.
-o \| --output De indeling die moet worden gebruikt voor het weergeven van uitvoer van de opdracht: default, tokenof json.
-h \| --help Help-informatie voor de opdracht weergeven.

Voorbeelden

Voer de volgende opdrachten uit om een leeg webproject te maken en voeg het NuGet-pakket Microsoft.AspNetCore.Authentication.JwtBearer toe:

dotnet new web -o MyJWT
cd MyJWT
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

Vervang de inhoud van het bestand Program.cs door de volgende code:

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

In de voorgaande code retourneert een GET-aanvraag naar het /secret eindpunt een 401 Unauthorized fout. Een productie-app kan de JWT ophalen van een beveiligingstokenservice, mogelijk in reactie op aanmelding met referenties. Wanneer u de API gebruikt tijdens lokale ontwikkeling, kan het dotnet user-jwts opdrachtregelprogramma worden gebruikt om app-specifieke lokale JWT's te maken en te beheren.

Het user-jwts hulpprogramma is vergelijkbaar met het hulpprogramma voor gebruikersgeheimen . Deze kan worden gebruikt voor het beheren van waarden voor de app die alleen geldig zijn voor de ontwikkelaar op de lokale computer. Het hulpprogramma maakt gebruik user-jwts van de user-secrets infrastructuur om de sleutel te beheren waarmee de JWT's zijn ondertekend. Deze methode zorgt ervoor dat de sleutel veilig wordt opgeslagen in het gebruikersprofiel.

Het user-jwts hulpprogramma verbergt implementatiedetails, zoals waar en hoe de waarden worden opgeslagen. Het hulpprogramma kan worden gebruikt zonder de implementatiedetails te kennen.

De waarden worden opgeslagen in een JSON-bestand in de gebruikersprofielmap van de lokale computer:

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

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

Een JWT maken

Met de volgende opdracht maakt u een lokale JWT:

dotnet user-jwts create

Met de voorgaande opdracht wordt een JWT gemaakt en wordt het projectbestand appsettings.Development.json bijgewerkt met JSON, vergelijkbaar met het volgende voorbeeld:

{
  "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"
      }
    }
  }
}

Kopieer de JWT en de ID die in de voorgaande opdracht is gemaakt. Gebruik een hulpprogramma zoals Curl om het /secret eindpunt te testen, waarbij {token} de eerder gegenereerde JWT is:

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

JWT-beveiligingsgegevens weergeven

Met de volgende opdracht worden de JWT-beveiligingsgegevens weergegeven, waaronder de vervaldatum, scopes, rollen, tokenheader en payload, en het compacte token.

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

Een token maken voor een specifieke gebruiker en een specifiek bereik

Met de volgende opdracht maakt u een JWT voor een gebruiker met de naam MyTestUser. Zie de create van opdrachten voor de ondersteunde opties.

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

De voorgaande opdracht heeft uitvoer die vergelijkbaar is met het volgende voorbeeld:

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

Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.{Remaining token deleted}

Het voorgaande token kan worden gebruikt om het /secret2 eindpunt in de volgende code te testen:

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