Ручная авторизация запросов с помощью интерфейса IAuthorizationService¶
Здесь нам придётся отказаться от декларативного подхода в пользу императивного.
ASP.NET Core предоставляет интерфейс IAuthorizationService, который можно внедрить через DI в Razor Pages и контроллеры для императивной авторизации:
[Authorize]
public class EditModel : PageModel
{
[BindProperty]
public Recipe Recipe { get; set; }
private readonly RecipeService _service;
private readonly IAuthorizationService _authService;
public EditModel(
RecipeService recipeSerivce,
IAuthorizationService authService)
{
_service = service;
_authService = authService;
}
public async Task<IActionResult> OnGet(int id)
{
Recipe = _service.GetRecipe(id);
var authResult = await _authService
.AuthorizeAsync(User, Recipe, "CanManageRecipe");
if (!authResult.Succeeded)
{
return new ForbidResult();
}
}
}
IAuthorizationService предоставляет метод AuthorizeAsync, которому требуются три вещи:
ClaimsPrincipal, вPageModelэто свойствоUser;- авторизуемый ресурс
Recipe; - политика —
"CanManageRecipe".
Попытка авторизации возвращает объект AuthorizationResult, успешность определяется свойством Succeeded.
Также необходимо определить политику "CanManageRecipe". Этот процесс совпадает с таковым для декларативного подхода.
Создаем требование:
Добавляем политику в
ConfigureServices:public void ConfigureServices(IServiceCollection services)
{
...
services.AddAuthorization(options => {
options.AddPolicy("CanManageRecipe", policyBuilder =>
policyBuilder.AddRequirements(new IsRecipeOwnerRequirement()));
});
...
}
Далее надо создать обработчик.
Последнее обновление :
5 мая 2023 г.
Дата создания : 8 октября 2022 г.
Дата создания : 8 октября 2022 г.