В чем разница между аутентификацией и авторизацией?

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

Ответ

Это последовательные этапы контроля доступа в системе.

Аутентификация (Authentication) — "Кто ты?" Это процесс верификации личности пользователя или системы. Он подтверждает, что субъект действительно является тем, за кого себя выдает.

  • Механизмы: Логин/пароль, сертификаты, одноразовые коды (2FA), биометрия, токены доступа (JWT, OAuth).
  • Результат: Установление контекста безопасности (например, ClaimsPrincipal в .NET), содержащего идентификатор пользователя и, возможно, его базовые утверждения (claims).

Авторизация (Authorization) — "Что тебе разрешено?" Это процесс проверки прав доступа уже аутентифицированного субъекта к выполнению действия или ресурсу.

  • Механизмы: Проверка ролей (Role-based), политик на основе утверждений (Claims-based), атрибуты [Authorize(Roles = "Admin")] в ASP.NET Core.
  • Результат: Разрешение или запрет на конкретную операцию.

Аналогия:

  • Аутентификация — это предъявление паспорта (доказываете, что вы — это вы).
  • Авторизация — это проверка, есть ли у вас виза или пропуск, чтобы войти в определенную зону.

Пример в ASP.NET Core:

// Контроллер или действие с атрибутами
[ApiController]
[Route("api/[controller]")]
public class DocumentsController : ControllerBase
{
    // 1. Аутентификация: Middleware (например, JWT Bearer) проверит токен и создаст User.
    // 2. Авторизация: Атрибут [Authorize] проверяет, что пользователь аутентифицирован.
    [Authorize]
    [HttpGet]
    public IActionResult GetAll() => Ok("Список документов");

    // 3. Более строгая авторизация: проверка конкретной роли.
    [Authorize(Roles = "Admin,Editor")]
    [HttpPost]
    public IActionResult Create(Document doc) => Ok("Документ создан");

    // 4. Авторизация на основе политик (гибкая проверка утверждений).
    [Authorize(Policy = "CanDeleteDocument")]
    [HttpDelete("{id}")]
    public IActionResult Delete(int id) => Ok("Документ удален");
}

Итог: Сначала система должна понять, кто вы (аутентификация), а затем решить, что вам можно (авторизация). Без успешной аутентификации авторизация невозможна.