← Назад к вопросам

Как устроена авторизация на проекте в котором работаешь?

1.7 Middle🔥 161 комментариев
#ASP.NET и Web API#Аутентификация и безопасность

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Архитектура авторизации в нашем проекте

В нашем проекте используется микросервисная архитектура с выделенным сервисом авторизации (Auth Service), построенным на ASP.NET Core 8 с реализацией OAuth 2.0 и OpenID Connect. Основной подход — JWT-токены (JSON Web Tokens) для stateless-аутентификации.

Ключевые компоненты системы

1. Токенная модель

Мы используем два типа токенов:

  • Access Token (короткоживущий, 15 минут) — для доступа к ресурсам
  • Refresh Token (долгоживущий, 7 дней) — для обновления access-токена
// Пример генерации JWT-токена
public async Task<JwtToken> GenerateTokenAsync(User user)
{
    var claims = new List<Claim>
    {
        new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
        new Claim(JwtRegisteredClaimNames.Email, user.Email),
        new Claim("permissions", string.Join(",", user.Permissions)),
        new Claim("tenant_id", user.TenantId.ToString())
    };

    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Secret"]));
    var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

    var token = new JwtSecurityToken(
        issuer: _configuration["Jwt:Issuer"],
        audience: _configuration["Jwt:Audience"],
        claims: claims,
        expires: DateTime.UtcNow.AddMinutes(15),
        signingCredentials: credentials
    );

    return new JwtToken
    {
        AccessToken = new JwtSecurityTokenHandler().WriteToken(token),
        RefreshToken = GenerateRefreshToken(),
        ExpiresAt = token.ValidTo
    };
}

2. Сервис авторизации

Реализует следующие endpoints:

  • /auth/login — аутентификация по логину/паролю
  • /auth/refresh — обновление токенов
  • /auth/logout — инвалидация токенов
  • /auth/validate — валидация токена (используется другими сервисами)

3. Проверка прав доступа

Используется политики авторизации ASP.NET Core (Policies) с кастомными requirements:

// Регистрация политик в Startup
services.AddAuthorization(options =>
{
    options.AddPolicy("RequireAdminRole", 
        policy => policy.RequireClaim("role", "admin"));
    
    options.AddPolicy("ProjectAccess", 
        policy => policy.Requirements.Add(new ProjectAccessRequirement()));
});

// Кастомный requirement
public class ProjectAccessRequirement : IAuthorizationRequirement
{
    public string RequiredPermission { get; }
    
    public ProjectAccessRequirement(string permission = "project.read")
    {
        RequiredPermission = permission;
    }
}

public class ProjectAccessHandler : AuthorizationHandler<ProjectAccessRequirement>
{
    protected override Task HandleRequirementAsync(
        AuthorizationHandlerContext context,
        ProjectAccessRequirement requirement)
    {
        var permissions = context.User.FindFirst("permissions")?.Value;
        
        if (permissions != null && permissions.Contains(requirement.RequiredPermission))
        {
            context.Succeed(requirement);
        }
        
        return Task.CompletedTask;
    }
}

Поток авторизации

  1. Аутентификация пользователя:

    • Клиент отправляет credentials на /auth/login
    • Сервис проверяет их в базе (с хешированием паролей через Argon2)
    • Генерирует пару access/refresh токенов
  2. Доступ к ресурсам:

    • Клиент добавляет access token в header Authorization: Bearer {token}
    • Каждый микросервис проверяет токен через встроенный middleware
    • При истечении токена — запрос на /auth/refresh
  3. Распределенная валидация:

    • Микросервисы кэшируют информацию о валидных токенах в Redis
    • При logout токены заносятся в blacklist в Redis

Интеграционные особенности

Для Web-клиентов:

  • Используем HTTP-only cookies для хранения refresh token
  • CORS политики для разделения доменов
  • Защита от CSRF через токены

Для мобильных приложений:

  • Secure storage для токенов
  • Биометрическая аутентификация как второй фактор

Для микросервисов:

  • Service-to-service авторизация через mutual TLS
  • API ключи для внешних интеграций

Безопасность

  • Хранение секретов: через HashiCorp Vault
  • Ротация ключей: автоматическая ежемесячная смена JWT-секретов
  • Мониторинг: логирование подозрительных попыток доступа
  • Rate limiting: ограничение попыток входа
  • Аудит: запись всех critical операций

Проблемы и решения

  1. Распределенный logout:

    • Реализовали blacklist токенов в Redis с TTL
    • Синхронизация через pub/sub каналы
  2. Масштабирование:

    • Stateless подход позволяет горизонтальное масштабирование
    • Кэширование данных пользователя в Redis
  3. Мультитенантность:

    • В токен включается tenant_id для изоляции данных
    • Динамические политики доступа в зависимости от tenant

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