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

Что такое авторизация?

1.0 Junior🔥 201 комментариев
#Аутентификация и безопасность

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

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

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

Авторизация: предоставление прав доступа в программных системах

Авторизация — это процесс проверки и предоставления прав доступа к ресурсам или функциональным возможностям системы после успешной аутентификации пользователя. Если аутентификация отвечает на вопрос "Кто вы?" (подтверждение личности), то авторизация отвечает на вопрос "Что вам разрешено делать?" (определение уровня доступа). В контексте C# backend-разработки это фундаментальный механизм безопасности, контролирующий бизнес-логику доступа.

Ключевые концепции авторизации

1. Принцип наименьших привилегий (Least Privilege)

Пользователь получает минимальный набор прав, необходимых для выполнения его задач. Например:

  • Обычный пользователь может читать свои данные
  • Модератор может редактировать контент
  • Администратор имеет полный доступ ко всем функциям

2. Модели авторизации

  • RBAC (Role-Based Access Control) — доступ на основе ролей
  • ABAC (Attribute-Based Access Control) — доступ на основе атрибутов
  • PBAC (Policy-Based Access Control) — политико-ориентированный контроль

Реализация авторизации в C# (ASP.NET Core)

Авторизация на основе ролей (RBAC)

// Настройка в Program.cs
builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("AdminOnly", policy => 
        policy.RequireRole("Administrator"));
    
    options.AddPolicy("ContentManager", policy => 
        policy.RequireRole("Editor", "Moderator"));
});

// Применение в контроллере
[Authorize(Roles = "Administrator")]
public class AdminController : ControllerBase
{
    [HttpGet("dashboard")]
    public IActionResult GetDashboard() => Ok("Admin dashboard");
    
    [Authorize(Roles = "Editor,Moderator")]
    [HttpGet("content")]
    public IActionResult GetContent() => Ok("Content management");
}

Авторизация на основе утверждений (Claims)

// Создание политики на основе утверждений
builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("SeniorEmployee", policy =>
        policy.RequireClaim("Department", "IT")
              .RequireClaim("Seniority", "Senior", "Lead"));
});

// Проверка в коде
[Authorize(Policy = "SeniorEmployee")]
public IActionResult GetSensitiveData()
{
    var department = User.FindFirst("Department")?.Value;
    return Ok($"Data for {department} department");
}

Кастомная авторизация через требования (Requirements)

public class MinimumExperienceRequirement : IAuthorizationRequirement
{
    public int RequiredYears { get; }
    public MinimumExperienceRequirement(int years) => RequiredYears = years;
}

public class ExperienceHandler : AuthorizationHandler<MinimumExperienceRequirement>
{
    protected override Task HandleRequirementAsync(
        AuthorizationHandlerContext context,
        MinimumExperienceRequirement requirement)
    {
        var experienceClaim = context.User.FindFirst("ExperienceYears");
        
        if (experienceClaim != null && 
            int.TryParse(experienceClaim.Value, out int years) &&
            years >= requirement.RequiredYears)
        {
            context.Succeed(requirement);
        }
        
        return Task.CompletedTask;
    }
}

// Регистрация и использование
builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("SeniorDev", policy =>
        policy.Requirements.Add(new MinimumExperienceRequirement(5)));
});

builder.Services.AddSingleton<IAuthorizationHandler, ExperienceHandler>();

Механизмы хранения и проверки прав

Хранение политик доступа

  1. В коде приложения — для простых статических правил
  2. В базе данных — для динамических, изменяемых политик
  3. В конфигурационных файлах — для гибкости развертывания
  4. Во внешних системах (Keycloak, Auth0) — для централизованного управления

Проверка авторизации в middleware pipeline

// Последовательность middleware в ASP.NET Core
app.UseRouting();
app.UseAuthentication();    // 1. Кто вы? (аутентификация)
app.UseAuthorization();     // 2. Что вам можно? (авторизация)
app.MapControllers();

Распространенные паттерны авторизации

Ресурсо-ориентированная авторизация

public class DocumentAuthorizationService
{
    public bool CanUserViewDocument(User user, Document document)
    {
        // Комплексная логика проверки
        return user.Id == document.OwnerId ||
               document.SharedWith.Contains(user.Id) ||
               user.Roles.Contains("Administrator");
    }
}

Делегированная авторизация (OAuth 2.0, OpenID Connect)

  • Access Tokens — токены доступа с scope (областью действия)
  • JWT (JSON Web Tokens) — самодостаточные токены с claims
  • Рефреш-токены — для обновления access-токенов

Лучшие практики реализации

  1. Разделение ответственности — отдельный сервис для логики авторизации
  2. Кеширование решений — для частых запросов к одним ресурсам
  3. Аудит и логирование — фиксация всех попыток доступа
  4. Тестирование политик — unit-тесты для всех сценариев доступа
  5. Гранулярность прав — детализированные permissions вместо общих ролей

Распространенные уязвимости и защита

  • Недостаточная авторизация — отсутствие проверок на уровне объектов
  • IDOR (Insecure Direct Object References) — доступ к чужим данным по ID
  • Эскалация привилегий — получение прав выше разрешенных

Авторизация в C# backend-приложениях — это не просто техническая проверка, а бизнес-логика безопасности, которая должна быть продумана, документирована и тщательно протестирована. Современные фреймворки ASP.NET Core предоставляют мощные инструменты для реализации гибких и безопасных систем контроля доступа, но ответственность за корректную архитектуру и реализацию лежит на разработчике.

Что такое авторизация? | PrepBro