问题描述
我想为我的 .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 (将#修改为@)