Введение: почему 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