Как использовать JWT токены для управления сессиями в C#?

Каким образом можно реализовать механизм управления сессиями для подключенных клиентов в веб-сервисе на C# .NET? Планирую использовать JWT токены для авторизации и сохранять их в базе данных.
  • 26 декабря 2023 г. 5:57
Ответы на вопрос 2
Для использования JWT токенов для управления сессиями в C# вы можете использовать библиотеку "System.IdentityModel.Tokens.Jwt", которая предоставляет удобные функции для создания, валидации и обработки JWT токенов.

Вот простой пример, как можно использовать JWT для управления сессиями в C#:

1. Установите пакет `System.IdentityModel.Tokens.Jwt` с помощью NuGet.

2. Создайте метод для генерации JWT токена:

```
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;

public string GenerateJwtToken(string secretKey, string issuer, string audience, string username)
{
    // Создаем claims с данными пользователя
    var claims = new[]
    {
        new Claim(JwtRegisteredClaimNames.Sub, username),
        new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
    };

    // Генерируем ключ
    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));

    // Создаем подпись на основе ключа
    var signingCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

    // Создаем JWT токен
    var token = new JwtSecurityToken(
        issuer: issuer,
        audience: audience,
        claims: claims,
        expires: DateTime.UtcNow.AddHours(1), // время жизни токена
        signingCredentials: signingCredentials);

    // Возвращаем сгенерированный JWT токен
    return new JwtSecurityTokenHandler().WriteToken(token);
}
```

3. Создайте метод для валидации JWT токена:

```
public bool ValidateJwtToken(string secretKey, string issuer, string audience, string token)
{
    // Создаем параметры валидации токена
    var validationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidIssuer = issuer,

        ValidateAudience = true,
        ValidAudience = audience,

        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey)),

        ValidateLifetime = true,
        ClockSkew = TimeSpan.Zero
    };

    try
    {
        // Валидируем токен
        var claimsPrincipal = new JwtSecurityTokenHandler().ValidateToken(token, validationParameters, out _);

        // Проверяем, что валидация прошла успешно
        return claimsPrincipal.Identity.IsAuthenticated;
    }
    catch (SecurityTokenValidationException)
    {
        // Если токен не валиден
        return false;
    }
}
```

4. Храните JWT токены в базе данных для каждого пользователя при успешной авторизации. При запросе от клиента, проверяйте наличие и валидность токена в базе данных.

5. При необходимости, обновляйте токен, если время его жизни истекло.

Это базовая реализация механизма управления сессиями с использованием JWT токенов в C#. Вы можете настроить этот код под свои требования и логику приложения.
Изучите более подробно об JWT токенах и IndentityServer'е, тогда у вас не будет желания хранить их в базе) Но сможете использовать это всё для аутентификации и авторизации. Так же советую посмотреть об OAuth/OAuth2.0 и OpenId Connect 

Если что-то более простое, тогда делайте просто на куках как под mvc:
Use cookie authentication without ASP.NET Core Identity
ASP.NET Core - Write a Simple Cookie Authentication
Похожие вопросы