ASP.NET Core Авторизация только для владельца - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть вопрос, похожий на Авторизация на основе владельца

Можно ли использовать авторизацию на основе ресурсов или авторизацию на основе политики разрешить только владельцу модели просматривать / редактировать / удалять ее?

с чем-то вроде

[Authorize(Policy = "OwnerAuthorization")]
public class EditModel : PageModel

Или мне нужно добавить логику к каждому OnGet / OnPost на каждой странице дляобработка авторизации?

1 Ответ

0 голосов
/ 05 декабря 2018

Нужно ли добавлять логику к каждому 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 и снова загрузит ресурс из базы данных.

...