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 gegeven JWTverwijderen.
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 Geef de details van een gegeven JWTweer.

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 wordt gemaakt. Standaard ingesteld op de huidige omgevingsgebruiker.
--audience De doelgroepen waarvoor de JWT is bedoeld. Standaard ingesteld op de URL's die zijn geconfigureerd in het launchSettings.json-bestand van het project.
--issuer De uitgevende instantie van de JWT. Wordt standaard ingesteld op dotnet-user-jwts.
--scope Een scopeclaim die moet worden toegevoegd aan de JWT. Specificeer eenmalig voor elke scope.
--role Een rolclaim om toe te voegen aan de JWT. Geef één keer op voor elke rol.
--claim Claims toevoegen 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]]]]. Standaard ingesteld op de datum en tijd waarop de JWT is 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 De hoeveelheid tijd die het JWT geldig blijft. Wanneer het tijdstip is bereikt, verloopt 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.

Voor gebruik met bestandgebaseerde apps

dotnet user-jwts werkt met op bestanden gebaseerde apps via de --file optie. Wijs --file het C#-bestand (.cs) van de app aan.

In het volgende voorbeeld is de app een bestand met de naam app.cs zonder een projectbestand en wordt de opdracht uitgevoerd in een opdrachtshell vanuit de hoofdmap van de app:

dotnet user-jwts create --file app.cs

De --file optie is van toepassing op elke user-jwts opdracht (create, clear, key, list, print, en remove), op dezelfde manier als de --project optie. Wanneer noch --file noch --project is opgegeven, zoekt het hulpprogramma in de huidige map naar een MSBuild-project.

Reglement:

  • Het pad dat aan --file wordt doorgegeven, moet een C#-bestand zijn met de bestandsextensie .cs.
  • De opties --file en --project kunnen niet samen worden gebruikt.

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 Security Token Service, mogelijk als reactie op aanmelding met aanmeldingsgegevens. 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 lokaal JWT:

dotnet user-jwts create

Met de voorgaande opdracht wordt een appsettings.Development.json gemaakt en het projectbestand JWT 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 het voorgaande commando zijn gemaakt. Gebruik een hulpprogramma zoals Curl om het /secret eindpunt te testen, waarbij {token} het 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 verlooptijd, 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();