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

Как на проекте работала аутентификация в API?

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

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

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

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

Реализация аутентификации в API на C# проекте

На моем последнем крупном проекте (микросервисная архитектура для fintech-платформы) мы использовали OAuth 2.0 и JWT (JSON Web Tokens) как основу системы аутентификации. Вот детали реализации:

Архитектура аутентификации

Система состояла из трех ключевых компонентов:

  • Identity Provider (IdP) - отдельный микросервис на ASP.NET Core 6
  • API Gateway с валидацией токенов
  • Resource Servers (основные бизнес-микросервисы)
// Пример конфигурации JWT в Program.cs Identity Provider
builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidIssuer = builder.Configuration["Jwt:Issuer"],
        ValidateAudience = true,
        ValidAudience = builder.Configuration["Jwt:Audience"],
        ValidateLifetime = true,
        IssuerSigningKey = new SymmetricSecurityKey(
            Encoding.UTF8.GetBytes(builder.Configuration["Jwt:SecretKey"])),
        ValidateIssuerSigningKey = true,
        ClockSkew = TimeSpan.Zero // Точное время без допуска
    };
});

Процесс аутентификации

  1. Клиентские запросы - все запросы от мобильных приложений и веб-клиентов обязаны включать Bearer token в заголовке Authorization
GET /api/v1/transactions HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
  1. Выдача токенов - IdP предоставлял три типа токенов:
    • Access Token (15 минут жизни) для доступа к API
    • Refresh Token (7 дней) для обновления access token
    • ID Token (OpenID Connect) для информации о пользователе
// Генерация токена в Identity Provider
public async Task<AuthResponse> GenerateTokenAsync(User user)
{
    var claims = new[]
    {
        new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
        new Claim(JwtRegisteredClaimNames.Email, user.Email),
        new Claim("tenant_id", user.TenantId.ToString()),
        new Claim("permissions", JsonSerializer.Serialize(user.Permissions)),
        new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
    };
    
    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:SecretKey"]));
    var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
    
    var token = new JwtSecurityToken(
        issuer: _config["Jwt:Issuer"],
        audience: _config["Jwt:Audience"],
        claims: claims,
        expires: DateTime.UtcNow.AddMinutes(15),
        signingCredentials: credentials
    );
    
    return new AuthResponse
    {
        AccessToken = new JwtSecurityTokenHandler().WriteToken(token),
        RefreshToken = GenerateRefreshToken(),
        ExpiresIn = 900
    };
}

Валидация и авторизация в микросервисах

Каждый микросервис использовал политики авторизации на основе claims:

// Настройка политик в бизнес-микросервисе
builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("TransactionRead", policy =>
        policy.RequireClaim("permissions", "transaction.read")
              .RequireClaim("tenant_id"));
    
    options.AddPolicy("AdminOnly", policy =>
        policy.RequireClaim("role", "admin")
              .RequireAssertion(context =>
                  context.User.HasClaim(c => c.Type == "tenant_id")));
});

// Использование в контроллере
[ApiController]
[Route("api/v1/transactions")]
[Authorize(Policy = "TransactionRead")]
public class TransactionsController : ControllerBase
{
    [HttpGet]
    public async Task<IActionResult> GetTransactions()
    {
        var tenantId = User.FindFirst("tenant_id")?.Value;
        // Бизнес-логика с учетом tenantId
    }
}

Безопасность и дополнительные меры

Мы реализовали несколько дополнительных уровней защиты:

  • Rate Limiting на уровне API Gateway (50 запросов/секунду на токен)
  • Audit Logging всех аутентификационных событий
  • Токены в памяти без сохранения в базу (кроме refresh tokens в Redis с инвалидацией при смене пароля)
  • CORS политики строго по доменам
  • Валидация issuer/audience в каждом микросервисе
  • Automatic token refresh на клиентской стороне при 401 ответе

Интеграция с внешними системами

Для внешних интеграций мы использовали:

  • Client Credentials Flow для сервис-

сервисной коммуникации

  • API Keys с ограниченным scope для партнерских интеграций
  • Webhooks с HMAC подписями для входящих уведомлений

Мониторинг и troubleshooting

Система включала:

  1. Prometheus метрики количества аутентификаций/отказов
  2. Distributed tracing (Jaeger) для отслеживания токена через микросервисы
  3. Alerting при аномальном количестве failed authentications
  4. Ежеквартальный аудит токенов и их payload

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

Наиболее сложными задачами были:

  • Баллансировка между security и UX - частые рефреши токенов vs. риски утечки
  • Распределенная инвалидация токенов при logout (решили через черный список в Redis на 15 минут)
  • Консистентность claims при изменении прав пользователя (добавили версионирование claims в токене)

Такая архитектура позволила нам обеспечить безопасность, масштабируемость и отслеживаемость аутентификации при обслуживании 50k+ активных пользователей и 15+ микросервисов.