Управление веб-токенами JSON в разработке с помощью dotnet user-jwts
Автор: Рик Андерсон (Rick Anderson)
Средство командной dotnet user-jwts
строки может создавать и управлять конкретными локальными веб-маркерами JSON (JWTs).
Краткие сведения
dotnet user-jwts [<PROJECT>] [command]
dotnet user-jwts [command] -h|--help
Description
Создает и управляет определенными локальными веб-токенами JSON для проекта.
Аргументы
PROJECT | SOLUTION
Проект MSBuild для применения команды. Если проект не указан, MSBuild выполняет поиск текущего рабочего каталога для файла с расширением файла, который заканчивается proj и использует этот файл.
Команды
Команда | Description |
---|---|
clear | Удалите все выданные JWTs для проекта. |
create | Выдача нового веб-токена JSON. |
remove | Удаление заданного JWT. |
key | Отображение или сброс ключа подписи, используемого для выдачи JWTs. |
список | Выводит список JWTs, выданных для проекта. |
…печать. | Отображение сведений о заданном JWT. |
Создание
Использование: dotnet user-jwts create [options]
Вариант | Описание |
---|---|
-p | --проект | Путь к проекту для работы. По умолчанию используется проект в текущем каталоге. |
--схема | Имя схемы, используемое для созданного маркера. По умолчанию используется значение "Носитель". |
-n | --имя | Имя пользователя для создания JWT. По умолчанию используется текущий пользователь среды. |
--публика | Аудитории для создания JWT. По умолчанию URL-адреса, настроенные в launchSettings.json проекта. |
--эмитент | Издатель JWT. По умолчанию используется значение dotnet-user-jwts. |
--scope | Утверждение области для добавления в JWT. Укажите один раз для каждой области. |
--role | Утверждение роли для добавления в JWT. Укажите один раз для каждой роли. |
--требование | Утверждения для добавления в JWT. Укажите один раз для каждого утверждения в формате "name=value". |
--not-до | Дата и время в формате UTC JWT не должно быть допустимым перед форматом "гггг-ММ-дд [[HH:mm[:ss]]]". По умолчанию используется дата и время создания JWT. |
--срок действия истекает | Дата и время окончания срока действия JWT в формате y-MM-dd [[[ [[ [HH:mm]]:ss]". Значение по умолчанию — 6 месяцев после даты --not-до даты. Не используйте этот параметр в сочетании с параметром --valid-for. |
--valid-for | Срок действия JWT должен истекать после. Укажите число, за которым следует тип длительности, например "d" в течение дней, "h" в течение нескольких часов, "m" в минутах и "s" в секундах, например 365d. Не используйте этот параметр в сочетании с параметром --expires-on. |
-o | --выпуск | Формат, используемый для отображения выходных данных из команды. Может быть одним из значений по умолчанию, token или json. |
-h | --Справка | Отображает справочные сведения. |
Примеры
Выполните следующие команды, чтобы создать пустой веб-проект и добавить пакет NuGet Microsoft.AspNetCore.Authentication.JwtBearer :
dotnet new web -o MyJWT
cd MyJWT
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
Замените все содержимое Program.cs
следующим кодом:
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();
В приведенном выше коде запрос GET возвращает /secret
ошибку 401 Unauthorized
. Производственное приложение может получить JWT из службы маркеров безопасности (STS), возможно, в ответ на вход с помощью набора учетных данных. Для работы с API во время локальной разработки dotnet user-jwts
средство командной строки можно использовать для создания локальных JWT для конкретного приложения и управления ими.
Инструмент user-jwts
похож на средство секретов пользователя, его можно использовать для управления значениями приложения, которые действительны только для разработчика на локальном компьютере. На самом деле средство user-jwts использует user-secrets
инфраструктуру для управления ключом, подписанным JWTs, обеспечивая безопасное хранение в профиле пользователя.
Средство user-jwts
скрывает сведения о реализации, например, где и как хранятся значения. Средство можно использовать без знания сведений о реализации. Значения хранятся в JSON-файле в папке профиля пользователя локального компьютера:
Путь к файловой системе:
%APPDATA%\Microsoft\UserSecrets\<secrets_GUID>\user-jwts.json
Создание JWT
Следующая команда создает локальный JWT:
dotnet user-jwts create
Предыдущая команда создает JWT и обновляет файл проекта appsettings.Development.json
с помощью JSON, аналогичного следующему:
{
"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"
}
}
}
}
Скопируйте JWT и ID
созданный в предыдущей команде. Используйте средство, например Curl, чтобы проверить /secret
:
curl -i -H "Authorization: Bearer {token}" https://localhost:{port}/secret
Где {token}
находится ранее созданный JWT.
Отображение сведений о безопасности JWT
Следующая команда отображает сведения о безопасности JWT, включая срок действия, области, роли, заголовок маркера и полезные данные, а также компактный маркер:
dotnet user-jwts print {ID} --show-all
Создание маркера для конкретного пользователя и области
Сведения о поддерживаемых параметрах создания см . в разделе "Создание " в этом разделе.
Следующая команда создает JWT для пользователя с именем MyTestUser
:
dotnet user-jwts create --name MyTestUser --scope "myapi:secrets"
Предыдущая команда имеет выходные данные, аналогичные следующему:
New JWT saved with ID '43e0b748'.
Name: MyTestUser
Scopes: myapi:secrets
Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.{Remaining token deleted}
Предыдущий маркер можно использовать для тестирования конечной /secret2
точки в следующем коде:
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();
ASP.NET Core