← Назад к вопросам
Как устроена авторизация на проекте в котором работаешь?
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;
}
}
Поток авторизации
-
Аутентификация пользователя:
- Клиент отправляет credentials на
/auth/login - Сервис проверяет их в базе (с хешированием паролей через Argon2)
- Генерирует пару access/refresh токенов
- Клиент отправляет credentials на
-
Доступ к ресурсам:
- Клиент добавляет access token в header
Authorization: Bearer {token} - Каждый микросервис проверяет токен через встроенный middleware
- При истечении токена — запрос на
/auth/refresh
- Клиент добавляет access token в header
-
Распределенная валидация:
- Микросервисы кэшируют информацию о валидных токенах в 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 операций
Проблемы и решения
-
Распределенный logout:
- Реализовали blacklist токенов в Redis с TTL
- Синхронизация через pub/sub каналы
-
Масштабирование:
- Stateless подход позволяет горизонтальное масштабирование
- Кэширование данных пользователя в Redis
-
Мультитенантность:
- В токен включается
tenant_idдля изоляции данных - Динамические политики доступа в зависимости от tenant
- В токен включается
Такая архитектура обеспечивает безопасность, масштабируемость и гибкость, позволяя адаптировать систему авторизации под различные типы клиентов и сценарии использования.