Создание обработчика AuthorizationHandler на основе ресурсов¶
Обработчик на основе ресурсов реализуется путём наследования от AuthorizationHandler<TRequirement, TResource> (ср. с обработчиком, в котором указан только тип требования):
public class IsRecipeOwnerHandler :
AuthorizationHandler<IsRecipeOwnerRequirement, Recipe>
{
private readonly UserManager<ApplicationUser> _userManager;
public IsRecipeOwnerHandler(UserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}
protected override async Task HandleRequirementAsync(
AuthorizationHandlerContext context,
IsRecipeOwnerRequirement requirement,
Recipe resource)
{
var appUser = await _userManager.GetUserAsync(context.User);
if (appUser == null) //аутентификация не пройдена
{
return;
}
if (resource.CreatedById == appUser.Id)
{
context.Succeed(requirement);
}
}
}
Здесь используется UserManager для загрузки сущности ApplicationUser на основе объекта ClaimsPrincipal из запроса.
От меня
В примере проверка, что пользователь аутентифицирован, отдана на откуп UserManager. Если мы не используем ASP.NET Core Identity, а используем что-то своё, то в этом случае нужно проверять ClaimsPrincipal напрямую. Например, так:
Также мы видим, что, помимо прочего, в метод HandleRequirementAsync передается ресурс Recipe; это объект, который передавали в метод AuthorizeAsync в IAuthorizationService. Используем этот ресурс, чтобы проверить, что он создан текущим пользователем.
Осталось только зарегистрировать обработчик в DI контейнере:
Здесь используется метод
AddScoped(), так как обработчик использует зависимость UserManager<>, которая применяет EF Core.
Дата создания : 8 октября 2022 г.