Zarządzanie JStokenami internetowymi w środowisku projektowym za pomocą polecenia dotnet user-jwts

Autor: Rick Anderson

dotnet user-jwts Narzędzie wiersza polecenia może tworzyć lokalne tokeny internetowe (JWTs) specyficzne dla JSaplikacji i zarządzać nimi.

Streszczenie

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

opis

Tworzy i zarządza lokalnymi tokenami w sieci Web specyficznymi dla JSprojektu.

Argumenty

PROJECT | SOLUTION

Projekt MSBuild, aby zastosować polecenie. Jeśli projekt nie zostanie określony, program MSBuild przeszukuje bieżący katalog roboczy dla pliku, który ma rozszerzenie pliku, które kończy się w pliku proj i używa tego pliku.

Polecenia

Polecenie opis
Wyczyść Usuń wszystkie wystawione JWTs dla projektu.
create Wydaj nowy JStoken w sieci Web.
remove Usuń daną JWT.
key Wyświetl lub zresetuj klucz podpisywania używany do wystawiania JWTs.
lista Wyświetla listę zestawów JWTs wystawionych dla projektu.
Drukowania Wyświetl szczegóły danego zestawu JWT.

Utworzenie

Użycie: dotnet user-jwts create [options]

Opcja Opis
-p | --Projektu Ścieżka projektu do działania. Domyślnie projekt jest w bieżącym katalogu.
--Schemat Nazwa schematu do użycia dla wygenerowanego tokenu. Wartość domyślna to "Bearer".
-n | --Nazwa Nazwa użytkownika do utworzenia zestawu JWT. Domyślnie jest to bieżący użytkownik środowiska.
--Publiczności Odbiorcy, dla których chcesz utworzyć zestaw JWT. Domyślnie adresy URL skonfigurowane podczas uruchamiania projektu Ustawienia.json.
--Emitenta Wystawca JWT. Wartość domyślna to "dotnet-user-jwts".
--Zakres Oświadczenie zakresu do dodania do zestawu JWT. Określ raz dla każdego zakresu.
--Roli Oświadczenie roli, które ma zostać dodane do zestawu JWT. Określ raz dla każdej roli.
--Roszczenia Oświadczenia do dodania do zestawu JWT. Określ raz dla każdego oświadczenia w formacie "name=value".
--not-before Data i godzina UTC, przed jaką JWT nie powinny być prawidłowe w formacie "rrrr-MM-dd [[HH:mm[[:ss]]]]". Domyślnie jest tworzona data i godzina utworzenia JWT.
--expires-on Data i godzina UTC, o których JWT powinny wygasnąć w formacie "rrrr-MM-dd [[[ [HH:mm]]:ss]]". Wartość domyślna to 6 miesięcy po dacie --not-before. Nie używaj tej opcji w połączeniu z opcją --valid-for.
--valid-for Okres, po upływie których JWT powinien wygasnąć. Określ użycie liczby, po której następuje typ czasu trwania, taki jak "d" dla dni, "h" dla godzin, "m" przez minuty i "s" w sekundach, np. 365d. Nie używaj tej opcji w połączeniu z opcją --expires-on.
-o | --Wyjście Format używany do wyświetlania danych wyjściowych z polecenia . Może być jednym z wartości "default", "token" lub "json".
-h | --Pomoc Pokaż informacje pomocy

Przykłady

Uruchom następujące polecenia, aby utworzyć pusty projekt internetowy i dodać pakiet NuGet Microsoft.AspNetCore.Authentication.JwtBearer :

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

Zastąp zawartość Program.cs następującym kodem:

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

W poprzednim kodzie żądanie /secret GET zwraca 401 Unauthorized błąd. Aplikacja produkcyjna może pobrać JWT z usługi tokenu zabezpieczającego (STS), być może w odpowiedzi na zalogowanie się za pośrednictwem zestawu poświadczeń. Na potrzeby pracy z interfejsem API podczas programowania dotnet user-jwts lokalnego narzędzie wiersza polecenia może służyć do tworzenia lokalnych zestawów JWTs specyficznych dla aplikacji i zarządzania nimi.

Narzędzie jest podobne do narzędzia user-secrets. Można user-jwts go użyć do zarządzania wartościami aplikacji, które są prawidłowe tylko dla dewelopera na komputerze lokalnym. W rzeczywistości narzędzie user-jwts korzysta z user-secrets infrastruktury do zarządzania kluczem podpisanym przez JWTs, upewniając się, że jest on bezpiecznie przechowywany w profilu użytkownika.

Narzędzie user-jwts ukrywa szczegóły implementacji, takie jak miejsce i sposób przechowywania wartości. Narzędzie może być używane bez znajomości szczegółów implementacji. Wartości są przechowywane w JSpliku ON w folderze profilu użytkownika komputera lokalnego:

Ścieżka systemu plików:

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

Tworzenie zestawu JWT

Następujące polecenie tworzy lokalny zestaw JWT:

dotnet user-jwts create

Poprzednie polecenie tworzy plik JWT i aktualizuje plik projektu appsettings.Development.json przy JSużyciu polecenia ON podobny do następującego:

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

Skopiuj JWT i ID utworzony w poprzednim poleceniu. Użyj narzędzia, takiego jak Curl, aby przetestować /secretprogram :

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

Gdzie {token} jest wcześniej wygenerowany zestaw JWT.

Wyświetlanie informacji o zabezpieczeniach JWT

Następujące polecenie wyświetla informacje o zabezpieczeniach JWT, w tym wygasanie, zakresy, role, nagłówek tokenu i ładunek oraz kompaktowy token:

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

Tworzenie tokenu dla określonego użytkownika i zakresu

Aby uzyskać informacje o obsługiwanych opcjach tworzenia, zobacz Tworzenie w tym temacie.

Następujące polecenie tworzy JWT dla użytkownika o nazwie MyTestUser:

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

Powyższe polecenie zawiera dane wyjściowe podobne do następujących:

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

Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.{Remaining token deleted}

Powyższy token może służyć do testowania punktu końcowego /secret2 w następującym kodzie:

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