OAuth 2.0 и JWT авторизация на C#: руководство для начинающих

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: почему OAuth 2.0 и JWT — стандарт современной авторизации?

В современной веб-разработке безопасная передача данных между клиентом и сервером — критически важная задача. Два ключевых протокола, которые помогают решить эту задачу — OAuth 2.0 (открытый протокол авторизации) и JWT (JSON Web Token).

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

В этой статье мы разберем, как реализовать OAuth 2.0 и JWT авторизацию на C# (.NET). Вы узнаете, как настроить middleware, сгенерировать токен и защитить API-эндпоинты. Материал рассчитан на начинающих разработчиков, знакомых с основами ASP.NET Core.

1. Основы OAuth 2.0 и JWT

Прежде чем писать код, давайте разберемся с ключевыми понятиями.

Что такое OAuth 2.0?

OAuth 2.0 — это протокол авторизации, который позволяет сторонним приложениям получать доступ к ресурсам пользователя (например, к данным профиля) без передачи его учетных данных. Вместо этого используется токен доступа (access token).

Основные роли в OAuth 2.0:

  • Resource Owner — пользователь, владеющий ресурсами.
  • Client — приложение, запрашивающее доступ.
  • Authorization Server — сервер, выдающий токены после аутентификации пользователя.
  • Resource Server — сервер, предоставляющий защищенные ресурсы (например, API).

Что такое JWT?

JWT (JSON Web Token) — это формат токена, состоящий из трех частей, разделенных точками:

  • Header — содержит тип токена (JWT) и алгоритм подписи (например, HS256).
  • Payload — содержит данные (claims), такие как идентификатор пользователя, роль, срок действия.
  • Signature — подпись, которая гарантирует целостность токена.

JWT токен выглядит так: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

JWT самодостаточен: серверу не нужно хранить сессии в базе данных, вся информация уже зашифрована в токене.

2. Настройка проекта ASP.NET Core для JWT авторизации

Создадим новый проект ASP.NET Core Web API и настроим JWT авторизацию.

Шаг 1: Установка пакетов NuGet

Для работы с JWT нам понадобится пакет Microsoft.AspNetCore.Authentication.JwtBearer. Установите его через NuGet Package Manager или консоль:

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

Шаг 2: Настройка appsettings.json

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

{
  "Jwt": {
    "Key": "YourSuperSecretKey123!@#$%^&*()",
    "Issuer": "YourApp",
    "Audience": "YourAppUsers",
    "ExpireMinutes": 60
  }
}

Шаг 3: Настройка Program.cs

В файле Program.cs (или Startup.cs для старых версий) добавляем сервисы аутентификации и middleware:

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

var builder = WebApplication.CreateBuilder(args);

// Настройка JWT аутентификации
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = builder.Configuration["Jwt:Issuer"],
            ValidAudience = builder.Configuration["Jwt:Audience"],
            IssuerSigningKey = new SymmetricSecurityKey(
                Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
        };
    });

builder.Services.AddAuthorization();
builder.Services.AddControllers();

var app = builder.Build();

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

app.MapControllers();
app.Run();

Обратите внимание: порядок middleware важен — сначала UseAuthentication(), затем UseAuthorization().

3. Генерация JWT токена при входе

Теперь создадим контроллер, который будет выдавать JWT токен после успешной аутентификации пользователя.

Создание модели логина

Создадим простую модель для запроса:

public class LoginRequest
{
    public string Username { get; set; }
    public string Password { get; set; }
}

Создание контроллера аутентификации

using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;

[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
    private readonly IConfiguration _configuration;

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

    [HttpPost("login")]
    public IActionResult Login([FromBody] LoginRequest request)
    {
        // Здесь должна быть проверка пользователя в БД
        if (request.Username == "admin" && request.Password == "password123")
        {
            var token = GenerateToken(request.Username);
            return Ok(new { token });
        }
        return Unauthorized("Неверный логин или пароль");
    }

    private string GenerateToken(string username)
    {
        var securityKey = new SymmetricSecurityKey(
            Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]));
        var credentials = new SigningCredentials(securityKey, 
            SecurityAlgorithms.HmacSha256);

        var claims = new[]
        {
            new Claim(ClaimTypes.Name, username),
            new Claim(ClaimTypes.Role, "User"),
            new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
        };

        var token = new JwtSecurityToken(
            issuer: _configuration["Jwt:Issuer"],
            audience                

Блоги

Рекомендаций по книгам