Выдача токенов
Создавайте подписанные токены при входе в систему.
«Выдача токенов» — бесплатный урок C# Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.
Выдача и проверка токенов
До сих пор вы проверяли токены. Теперь вы будете их выдавать: после успешного входа пользователя ваше API создаёт подписанный JWT и возвращает его.
Основной тип для этого — JwtSecurityTokenHandler из System.IdentityModel.Tokens.Jwt.
dotnet add package System.IdentityModel.Tokens.JwtКлюч подписи
Для подписи токена нужен ключ. При использовании HS256 повторно используйте тот же симметричный секрет, который применяет проверяющая сторона.
Не храните этот секрет в системе контроля версий — загружайте его из конфигурации или хранилища секретов.
var key = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(configuration["Jwt:Key"]!));SigningCredentials
SigningCredentials связывает ключ с алгоритмом. Для симметричного ключа используйте SecurityAlgorithms.HmacSha256.
var creds = new SigningCredentials(
key,
SecurityAlgorithms.HmacSha256);Формирование утверждений
Решите, какие данные должны попасть в токен. Всегда включайте субъект (идентификатор пользователя), а также любые роли или данные, необходимые API.
Добавьте уникальный jti, чтобы можно было идентифицировать каждый токен.
var claims = new List<Claim>
{
new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim(ClaimTypes.Name, user.UserName),
new Claim(ClaimTypes.Role, user.Role)
};Создание JwtSecurityToken
JwtSecurityToken объединяет издателя, аудиторию, утверждения, срок действия и учётные данные подписи в объекте токена.
var token = new JwtSecurityToken(
issuer: configuration["Jwt:Issuer"],
audience: configuration["Jwt:Audience"],
claims: claims,
notBefore: DateTime.UtcNow,
expires: DateTime.UtcNow.AddMinutes(15),
signingCredentials: creds);Сериализация в строку
Перед отправкой клиенту объект токена необходимо записать в компактную строковую форму header.payload.signature.
var handler = new JwtSecurityTokenHandler();
string jwt = handler.WriteToken(token);
// jwt now looks like eyJhbGciOiJI...Повторно используемый сервис токенов
Вынесите логику в сервис, чтобы контроллеры оставались чистыми, а конфигурация находилась в одном месте.
public class TokenService(IConfiguration config)
{
public string CreateAccessToken(AppUser user)
{
var key = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(config["Jwt:Key"]!));
var creds = new SigningCredentials(
key, SecurityAlgorithms.HmacSha256);
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
new Claim(ClaimTypes.Role, user.Role)
};
var token = new JwtSecurityToken(
config["Jwt:Issuer"], config["Jwt:Audience"],
claims, expires: DateTime.UtcNow.AddMinutes(15),
signingCredentials: creds);
return new JwtSecurityTokenHandler().WriteToken(token);
}
}Подключение конечной точки входа
Конечная точка входа проверяет учётные данные, затем вызывает сервис и возвращает токен клиенту.
app.MapPost("/login", (LoginDto dto, TokenService tokens) =>
{
var user = Authenticate(dto.Username, dto.Password);
if (user is null) return Results.Unauthorized();
return Results.Ok(new { accessToken = tokens.CreateAccessToken(user) });
});Симметричная и асимметричная подпись
HS256 использует один общий секрет и для подписи, и для проверки. RS256 использует закрытый ключ для подписи и открытый ключ для проверки.
Асимметричная подпись позволяет опубликовать открытый ключ, чтобы другие сервисы могли проверять токены, не имея доступа к секрету подписи.
var creds = new SigningCredentials(
new RsaSecurityKey(rsaPrivateKey),
SecurityAlgorithms.RsaSha256);Регистрация сервиса
Добавьте сервис токенов в контейнер внедрения зависимостей, чтобы его можно было внедрять в конечные точки и контроллеры.
builder.Services.AddScoped<TokenService>();Компактные токены с коротким сроком действия
При выдаче токенов соблюдайте две рекомендации:
- Компактность: включайте только утверждения, необходимые API, — токен передаётся с каждым запросом.
- Короткий срок действия: токены доступа сроком от 5 до 15 минут ограничивают ущерб, если один из них утечёт.
expires: DateTime.UtcNow.AddMinutes(15)Быстрая проверка
Подтвердите, что вы усвоили материал о выдаче токенов.
Повторение
Вы научились выдавать подписанные JWT:
SigningCredentialsсвязывает ваш ключ с алгоритмом.- Создайте список объектов
Claim, а затем объектJwtSecurityTokenс издателем, аудиторией и сроком действия. JwtSecurityTokenHandler.WriteTokenсериализует его в компактную строку.- Токены должны быть компактными и иметь короткий срок действия.
Далее: токены обновления и стратегии управления сроком действия.
Часто задаваемые вопросы
Урок «Выдача токенов» бесплатный?
Да — полный текст урока «Выдача токенов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.
Чему я научусь в уроке «Выдача токенов»?
Создавайте подписанные токены при входе в систему. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Выдача токенов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Структура JWT и утверждения
- Настройка аутентификации JWT Bearer
- Выдача токенов
- Токены обновления и срок действия