Реализовывал ли с нуля систему авторизации и аутентификации?

«Реализовывал ли с нуля систему авторизации и аутентификации?» — вопрос из категории Безопасность, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, несколько раз. При проектировании таких систем ключевыми задачами являются безопасное управление пользовательскими сессиями, хранение учетных данных и контроль доступа.

Чаще всего я использовал JWT (JSON Web Tokens) для stateless-аутентификации в REST API и SPA. Основные преимущества — масштабируемость и простота использования на стороне клиента. Вот пример генерации токена на C#:

public string GenerateJwtToken(User user)
{
    var tokenHandler = new JwtSecurityTokenHandler();
    // Секретный ключ должен храниться в безопасном месте, например, в конфигурации
    var key = Encoding.ASCII.GetBytes(_configuration["JwtSettings:Secret"]);

    var tokenDescriptor = new SecurityTokenDescriptor
    {
        Subject = new ClaimsIdentity(new[] 
        {
            new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
            new Claim(ClaimTypes.Role, user.Role) // Добавление роли
        }),
        Expires = DateTime.UtcNow.AddHours(3), // Короткое время жизни токена безопаснее
        Issuer = _configuration["JwtSettings:Issuer"],
        Audience = _configuration["JwtSettings:Audience"],
        SigningCredentials = new SigningCredentials(
            new SymmetricSecurityKey(key), 
            SecurityAlgorithms.HmacSha256Signature)
    };

    var token = tokenHandler.CreateToken(tokenDescriptor);
    return tokenHandler.WriteToken(token);
}

Также реализовывал системы на основе OAuth 2.0 / OpenID Connect (например, с использованием IdentityServer или сторонних провайдеров вроде Auth0) для централизованного управления доступом и поддержки социального входа.

Критически важные меры безопасности, которые я всегда учитываю:

  • Хеширование паролей: Использую алгоритмы, устойчивые к перебору, такие как BCrypt или Argon2. Никогда не храню пароли в открытом виде.
  • Защита от атак: Реализую защиту от CSRF (для cookie-сессий), ограничение попыток входа (rate limiting) и валидацию всех входящих данных.
  • Принцип наименьших привилегий: Строгая ролевая модель (RBAC) или политики на основе claims, чтобы пользователи имели доступ только к необходимым ресурсам.
  • Безопасная передача: Всегда использую HTTPS. Для JWT передаю токен в заголовке Authorization: Bearer <token>.

Выбор подхода (JWT, сессии на сервере, OAuth) зависит от требований проекта: нужна ли stateless-архитектура, единый вход (SSO) или интеграция со сторонними сервисами.