0Pricing
C# Academy · Урок

Выдача токенов

Создавайте подписанные токены при входе в систему.

«Выдача токенов» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Структура JWT и утверждения
  2. Настройка аутентификации JWT Bearer
  3. Выдача токенов
  4. Токены обновления и срок действия
← Назад к C# Academy