0Pricing
C# Academy · Урок

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

Ограничивайте конечные точки по ролям пользователей.

«Авторизация на основе ролей» — бесплатный урок C# Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.

Аутентификация и авторизация

Аутентификация отвечает на вопрос «кто вы?». Авторизация отвечает на вопрос «что вам разрешено делать?».

Простейшая модель авторизации в ASP.NET Core основана на ролях: пользователь принадлежит к ролям, а для конечных точек требуются определённые роли.

// User has roles: admin, editor
// Endpoint requires: admin

Откуда берутся роли

Роль — это всего лишь утверждение типа ClaimTypes.Role. При выдаче JWT добавляйте по одному утверждению роли для каждой роли пользователя.

var claims = new List<Claim>
{
    new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
    new Claim(ClaimTypes.Role, "admin"),
    new Claim(ClaimTypes.Role, "editor")
};

Тип утверждения роли

Чтобы работали [Authorize(Roles=...)] и User.IsInRole, обработчик должен знать, какой тип утверждения представляет роль.

По умолчанию ключ JWT role сопоставляется с ClaimTypes.Role. Если вы используете пользовательский ключ, сообщите его проверяющей стороне через RoleClaimType.

options.TokenValidationParameters = new TokenValidationParameters
{
    RoleClaimType = ClaimTypes.Role
};

Требование одной роли

Примените [Authorize(Roles = "admin")] к контроллеру или действию. Только пользователи с ролью admin могут получить к ним доступ.

[Authorize(Roles = "admin")]
[HttpDelete("users/{id}")]
public IActionResult DeleteUser(int id)
{
    // only admins reach here
    return NoContent();
}

Требование одной из нескольких ролей

Список, разделённый запятыми, означает OR: пользователю нужна как минимум одна из перечисленных ролей.

[Authorize(Roles = "admin,editor")]
[HttpPut("articles/{id}")]
public IActionResult Update(int id) => Ok();
// admins OR editors are allowed

Требование нескольких ролей (AND)

Чтобы требовать наличие всех ролей из нескольких, добавьте несколько атрибутов [Authorize]. Каждый из них должен пройти проверку.

[Authorize(Roles = "employee")]
[Authorize(Roles = "manager")]
public IActionResult ApproveBudget() => Ok();
// must be BOTH employee AND manager

Проверка ролей в коде

Иногда проверка роли нужна прямо в теле метода, а не только на входе. Используйте User.IsInRole.

public IActionResult GetReport()
{
    var data = BuildReport();
    if (User.IsInRole("admin"))
        data.IncludeSensitiveColumns();
    return Ok(data);
}

Эквивалент минимальных API

Минимальные API используют .RequireAuthorization со встроенной политикой или, что проще, позволяют требовать роль через именованную политику.

app.MapDelete("/users/{id}", (int id) => Results.NoContent())
   .RequireAuthorization(p => p.RequireRole("admin"));

Роли в иерархии

В ASP.NET Core нет встроенной иерархии ролей. Если администраторы должны автоматически получать права редактора, при входе выдавайте оба утверждения о ролях или моделируйте это с помощью политик (в следующем курсе).

// Grant both at login if admin >= editor
new Claim(ClaimTypes.Role, "admin");
new Claim(ClaimTypes.Role, "editor");

Когда ролей недостаточно

Роли слишком общие. Когда правила зависят от данных (например, «изменять может только владелец») или требуются детализированные разрешения, проверки ролей становятся громоздкими.

Здесь на помощь приходят авторизация на основе утверждений и авторизация на основе политик.

// Hard to express with roles alone:
// "editors, but only for their own department"

Возврат 403 и 401

Если пользователь не аутентифицирован, проверка роли возвращает 401 Unauthorized. Если пользователь аутентифицирован, но у него нет этой роли, он получает 403 Forbidden.

// No/invalid token         -> 401 Unauthorized
// Valid token, wrong role   -> 403 Forbidden

Быстрая проверка

Проверьте свои знания о ролях.

Итоги

Вы изучили авторизацию на основе ролей:

  • Роли — это утверждения ClaimTypes.Role, помещённые в токен.
  • [Authorize(Roles = "a,b")] означает OR; последовательное применение атрибутов означает AND.
  • User.IsInRole проверяет роли в коде.
  • Роли слишком общие — для правил, зависящих от данных, нужны более гибкие модели.

Далее: авторизация на основе утверждений.

Часто задаваемые вопросы

Урок «Авторизация на основе ролей» бесплатный?

Да — полный текст урока «Авторизация на основе ролей» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.

Чему я научусь в уроке «Авторизация на основе ролей»?

Ограничивайте конечные точки по ролям пользователей. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Авторизация на основе ролей»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Авторизация на основе ролей
  2. Авторизация на основе утверждений
  3. Авторизация на основе политик
  4. Пользовательские требования авторизации
← Назад к C# Academy