仅限所有者的ASP.NET核心授权

仅限所有者的ASP.NET核心授权,asp.net,razor,asp.net-core,razor-pages,Asp.net,Razor,Asp.net Core,Razor Pages,我有一个类似的问题 是否可以使用或仅允许模型所有者查看/编辑/删除模型 有点像 [Authorize(Policy = "OwnerAuthorization")] public class EditModel : PageModel 或者我必须在每页的每个OnGet/OnPost中添加逻辑来处理授权 我是否必须在每页的每个OnGet/OnPost中添加逻辑来处理授权 您不必这样做,但是为了获得更好的性能,您应该为每个页面上的每个OnGet/OnPost添加逻辑 要以基于资源的授权方式对请求进

我有一个类似的问题

是否可以使用或仅允许模型所有者查看/编辑/删除模型

有点像

[Authorize(Policy = "OwnerAuthorization")]
public class EditModel : PageModel
或者我必须在每页的每个OnGet/OnPost中添加逻辑来处理授权

我是否必须在每页的每个OnGet/OnPost中添加逻辑来处理授权

您不必这样做,但是为了获得更好的性能,您应该为每个页面上的每个OnGet/OnPost添加逻辑

要以基于资源的授权方式对请求进行授权,首先需要知道资源是什么,然后才能根据资源和策略对用户进行授权

通常,我们需要从服务器加载资源,然后才能知道资源是否属于当前用户。由于从服务器加载资源通常在action方法中完成,因此我们通常在action方法中授权请求。这正是本文所描述的

但是,如果我们选择仅使用[AuthorizePolicy=OwnerAuthorization]装饰页面模型,并且不调用_authZService.AuthorizeAsyncUser、resource、OwnerAuthorization;在action方法中,我们必须在授权处理程序或简单函数中加载资源。换句话说,我们将查询数据库两次。假设用户想要编辑一个Foo模型,然后向/Foo/edit?id=1发出HTTP GET请求以显示表单。OnGetAsynint?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并再次从数据库加载资源

    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();
    }