Нужно ли добавлять логику к каждому OnGet / OnPost на каждой странице для обработки авторизации?
Не нужно, но для повышения производительности следует добавитьлогика для каждого OnGet / OnPost на каждой странице.
Чтобы авторизовать запрос в виде resource-based authorization
, , нам нужно сначала узнать, что это за ресурс, и только послечто мы можем авторизовать пользователя в соответствии с ресурсом и политикой .
Как правило, нам нужно загрузить ресурс с сервера, а затем мы можем узнать, принадлежит ли ресурс текущему пользователю.Поскольку загрузка ресурса с сервера обычно выполняется в методе действия, мы обычно авторизуем запрос в методе действия.Это именно то, что описано в официальном документе .
var authorizationResult = await _authorizationService
.AuthorizeAsync(User, Document, "EditPolicy");
if (authorizationResult.Succeeded)
{
return Page();
}
else if (User.Identity.IsAuthenticated)
{
return new ForbidResult();
}
else
{
return new ChallengeResult();
}
Однако, если мы решим украшать модель страницы только с [Authorize(Policy = "OwnerAuthorization")]
, и невызовите _authZService.AuthorizeAsync(User, resource, "OwnerAuthorization");
в методе действия, нам нужно загрузить ресурс в обработчике авторизации (или простой функции).Другими словами, мы дважды запросим базу данных .Допустим, пользователь хочет отредактировать модель Foo
, а затем сделать HTTP-запрос GET для /Foo/Edit?id=1
, чтобы показать форму.Метод OnGetAsync(int? id)
:
public async Task<IActionResult> OnGetAsync(int? id)
{
if (id == null){ return NotFound(); }
// load foo from database
Foo = await _context.Foos.FirstOrDefaultAsync(m => m.Id == id);
if (Foo == null){ return NotFound(); }
return Page();
}
Теперь авторизация на основе ресурсов загрузит сущность Foo из базы данных и проверит владельца.В случае успеха метод действия затем проверит model.id и снова загрузит ресурс из базы данных.