Реализация JWT-аутентификации в приложениях .NET для безопасного и масштабируемого решения.

В последние годы аутентификация на основе токенов становится все более популярной, предлагая более безопасное и масштабируемое решение, чем традиционная аутентификация на основе файлов cookie. Одним из наиболее широко распространенных методов аутентификации на основе токенов являются веб-токены JSON (JWT). В этом посте мы рассмотрим основы JWT и предоставим пошаговые инструкции по реализации JWT-аутентификации в ваших .NET-приложениях.

Что такое веб-токен JSON (JWT)?

Веб-токен JSON (JWT) — это открытый стандарт (RFC 7519), определяющий компактный, автономный способ безопасной передачи информации между сторонами в виде объекта JSON. JWT часто используются для целей аутентификации и авторизации, поскольку они могут быть подписаны с использованием секретного ключа или пары открытого/закрытого ключей.

JWT состоит из трех частей: заголовок, полезная нагрузка и подпись. Заголовок и полезные данные представляют собой строки JSON в кодировке Base64Url, которые соединяются с разделителем точки (.), а затем подписываются для создания подписи.

Настройка аутентификации JWT в .NET

Для реализации JWT-аутентификации в приложении .NET мы будем использовать пакет Microsoft.AspNetCore.Authentication.JwtBearer. Сначала установите пакет с помощью диспетчера пакетов NuGet:

Install-Package Microsoft.AspNetCore.Authentication.JwtBearer

Настройка аутентификации JWT в Startup.cs

В файле Startup.cs добавьте следующие операторы using:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;

Затем в методе ConfigureServices добавьте промежуточное ПО аутентификации JWT:

public void ConfigureServices(IServiceCollection services)
{
    // ...

    // Add JWT authentication
    services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = Configuration["Jwt:Issuer"],
            ValidAudience = Configuration["Jwt:Audience"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:SecretKey"]))
        };
    });

    // ...
}

В методе Configure добавьте промежуточное ПО аутентификации:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // ...

    app.UseAuthentication();
    app.UseAuthorization();

    // ...
}

Генерация и проверка токенов JWT

Чтобы сгенерировать токен JWT, создайте вспомогательный класс с именем JwtTokenGenerator:

using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;

public class JwtTokenGenerator
{
    private readonly IConfiguration _configuration;

    public JwtTokenGenerator(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    public string GenerateToken(string username)
    {
        var claims = new[]
        {
            new Claim(JwtRegisteredClaimNames.Sub, username),
            new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
        };

        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SecretKey"]));
        var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
        var expires = DateTime.Now.AddDays(Convert.ToDouble(_configuration["Jwt:ExpirationInDays"]));

        var token = new JwtSecurityToken(
            _configuration["Jwt:Issuer"],
            _configuration["Jwt:Audience"],
            claims,
            expires: expires,
            signingCredentials: creds
        );

        return new JwtSecurityTokenHandler().WriteToken(token);
    }
}

Имея класс `JwtTokenGenerator`, вы теперь можете сгенерировать токен JWT для пользователя. Вот пример того, как создать токен, когда пользователь успешно входит в систему:

[HttpPost("login")]
public async Task<IActionResult> Login([FromBody] LoginModel model)
{
    // Replace with your actual user validation logic
    if (IsValidUser(model))
    {
        var tokenGenerator = new JwtTokenGenerator(Configuration);
        var token = tokenGenerator.GenerateToken(model.Username);
        return Ok(new { token });
    }

    return Unauthorized();
}

private bool IsValidUser(LoginModel model)
{
    // Implement your user validation logic here
    return true;
}

Когда пользователь делает запрос с действительным токеном JWT, промежуточное ПО JwtBearer проверяет токен, и вы можете получить доступ к утверждениям пользователя через свойство HttpContext.User.

Заключение

Реализация JWT-аутентификации в приложениях .NET — это безопасный и эффективный способ управления аутентификацией пользователей. Следуя шагам, описанным в этом посте, вы сможете создавать, проверять и управлять токенами JWT в своих проектах .NET. JWT предоставляет масштабируемое и автономное решение для безопасной передачи пользовательской информации, что делает его отличным выбором для современных веб-приложений.

Вы можете получить полный доступ ко всем историям на Medium всего за 5 долларов в месяц, зарегистрировавшись по этой ссылке.

Повышение уровня кодирования

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:

  • 👏 Хлопайте за историю и подписывайтесь на автора 👉
  • 📰 Смотрите больше контента в публикации Level Up Coding
  • 💰 Бесплатный курс собеседования по программированию ⇒ Просмотреть курс
  • 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"

🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу