将 AuthorizationPolicy 绑定到控制器/操作而不使用 AuthorizeAttribute

问题描述

我想为我的 .NET Core API 添加授权。假设我有一个具有以下操作的 PersonController:

  • GetPerson(根据 id 检索 Person)

  • PostPerson(添加一个新人)

  • DeletePerson(删除一个人)

     [Route("[controller]")]
     [ApiController]
     public class PersonController : ControllerBase
     {
         [HttpGet("{id}")]
         public async Task<ActionResult<PersonModel>> GetPerson(int id)
         {
             //
         }
    
         [HttpPost]
         public async Task<ActionResult<PersonModel>> PostPerson(PersonModel model)
         {
            //
         }
    
         [HttpDelete("{id}")]
         public async Task<ActionResult> DeletePerson(int id)
         {
            //
         }
     }
    

在这个例子中,我将使用两个角色。 'SuperAdmin' 应该能够执行所有操作,而 'PersonReader' 应该只能执行 GetPerson 调用。尝试将 PostPerson 或 DeletePerson 作为 PersonReader 执行应该会失败。

我创建了以下授权策略:

                options.AddPolicy("SuperAdmin",policy =>
                    policy.RequireAuthenticatedUser()
                    .RequireRole("SuperAdmin")
                );
                options.AddPolicy("PersonReader",policy =>
                    policy.RequireAuthenticatedUser()
                    .RequireRole("PersonReader")
                );

但现在我想将这些策略绑定到控制器操作,以说明需要哪些策略才能执行控制器操作。我知道这可以通过这样的 authorizationAttribute 来完成:[Authorize(Policy="X"] 但我希望能够在不使用 AuthorizationAttributes 的情况下做到这一点。

为什么我不能使用 [Authorize] 属性?
详细的就不多说了,Controller 的源代码是生成的。这意味着一旦再次生成,所有手动更改都将被覆盖。因此,授权不应在控制器中。

startup.cs 中,我将控制器映射到端点,如下所示:

app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });

可以像这样为所有控制器绑定一个策略:

endpoints.MapControllers().RequireAuthorization("SuperAdmin");

但这意味着我将要求所有控制器操作都使用“超级管理员”策略。有了这个,我无法为特定操作定义所需的策略。我希望做这样的事情:

// pseudo-code  
// endpoints.MapControllerAction("GetPerson").RequireAuthorization("SuperAdmin","PersonReader");

不幸的是,我找不到任何方法来做到这一点。有没有办法在不使用 [Authorize] 属性的情况下将策略绑定到控制器操作?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)