Перейти к содержанию

Управление доступом с авторизацией на основе ресурсов

Авторизация на основе ресурсов — распространённая задача для приложений, особенно когда есть пользователи, которые могут создавать или редактировать какие-то документы.
Рассмотрим наше приложение с рецептами. Добавим в него новое поведение:

  • только авторизованные пользователи должны иметь возможность создавать новые рецепты;
  • вы можете редактировать только созданные вами рецепты.

Первое требование легко выполнить, декорировав страницу Create.cshtml атрибутом [Authorize], как обсуждалось ранее.

[Authorize]
public class CreateModel : PageModel
{
    [BindProperty]
    public CreateRecipeCommand Input { get; set; }

    public OnGet()
    {
        Input = new CreateRecipeCommand();
    }

    public async Task<IActionResult> OnPost()
    {
        //Тело метода опустим
    }
}

А вот для того, чтобы выполнить второе требование, нужно применить другую технику.
Для начала предположим, мы решили проверять принадлежность рецепта прямо в обработчике страницы:

...
public IActionResult OnGet(int id)
{
    var recipe = _service.GetRecipe(id);
    var createdById = recipe.CreatedById;
    //Авторизация пользователя на основе createdById
    if(isAuthorized)
    {
        return View(recipe);
    }
    ...
}
...

Ручная авторизация запросов с помощью интерфейса IAuthorizationService

Создание обработчика AuthorizationHandler на основе ресурсов

%% Всё, описанное в этой карточке (и вложенных), работает И для Razor Pages, И для WebApi. Однако, для WebApi/контроллеров MVC можно сделать кастомные атрибуты, как у нас в Компасе. Надо не забыть вычленить логику и записать в отдельные карточки %%


Последнее обновление : 5 мая 2023 г.
Дата создания : 8 октября 2022 г.

Комментарии

Комментарии