← Назад к вопросам
Как на проекте работала аутентификация в 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 // Точное время без допуска
};
});
Процесс аутентификации
- Клиентские запросы - все запросы от мобильных приложений и веб-клиентов обязаны включать Bearer token в заголовке Authorization
GET /api/v1/transactions HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
- Выдача токенов - 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
Система включала:
- Prometheus метрики количества аутентификаций/отказов
- Distributed tracing (Jaeger) для отслеживания токена через микросервисы
- Alerting при аномальном количестве failed authentications
- Ежеквартальный аудит токенов и их payload
Проблемы и решения
Наиболее сложными задачами были:
- Баллансировка между security и UX - частые рефреши токенов vs. риски утечки
- Распределенная инвалидация токенов при logout (решили через черный список в Redis на 15 минут)
- Консистентность claims при изменении прав пользователя (добавили версионирование claims в токене)
Такая архитектура позволила нам обеспечить безопасность, масштабируемость и отслеживаемость аутентификации при обслуживании 50k+ активных пользователей и 15+ микросервисов.