继承控制器中的.Net核心授权属性
.Net core Authorize attribute in inherited controller
我在授权策略方面遇到了一些问题。我有一个带动作的 baseWebApiController
[HttpDelete("{id}"), Authorize(Policy = "Administrator")]
public virtual async Task<IActionResult> Delete(int id) {}
但是在从上面继承的某个控制器中,我也想授予用户访问权限,策略如下:
[HttpDelete("{id}"), Authorize(Policy = "All")]
public override Task<IActionResult> Delete(int id){}
普通用户似乎无法访问此操作。我是否必须进一步搜索我的策略配置中的错误,或者因为控制器是继承的,所以它的属性被忽略了?
谢谢
AuthorizeAttribute
是一个继承的属性,允许多次应用。
这意味着在继承您已经具有 AuthorizeAttribute
的方法时,该方法将被继承。所以你的 subclass 中的最终函数定义看起来像这样:
[Authorize(Policy = "Administrator")]
[Authorize(Policy = "All")]
public override Task<IActionResult> Delete(int id)
所以这条路线现在有两个政策。这是一个问题,因为政策旨在累积。因此 所有 策略必须通过才能使身份验证成功。
当然,这对你不起作用,因为你实际上想从 base class 中“洗掉”原始策略。但这不可能,因此您必须从基础 class 中删除该策略,并可能为这些策略引入第二个仅限管理员的 class。
这里的普遍问题是您的策略设计似乎是基于角色。您正在使用策略,但实际上,您正在检查那里的角色。相反,您应该考虑处理需求:例如,要删除某些内容,用户需要满足“DeletionAllowed”需求。这允许更细粒度的策略系统。最大的好处是什么?需求处理者是分离的:所以一个能够满足需求的处理者就足以通过它。
我在授权策略方面遇到了一些问题。我有一个带动作的 baseWebApiController
[HttpDelete("{id}"), Authorize(Policy = "Administrator")]
public virtual async Task<IActionResult> Delete(int id) {}
但是在从上面继承的某个控制器中,我也想授予用户访问权限,策略如下:
[HttpDelete("{id}"), Authorize(Policy = "All")]
public override Task<IActionResult> Delete(int id){}
普通用户似乎无法访问此操作。我是否必须进一步搜索我的策略配置中的错误,或者因为控制器是继承的,所以它的属性被忽略了?
谢谢
AuthorizeAttribute
是一个继承的属性,允许多次应用。
这意味着在继承您已经具有 AuthorizeAttribute
的方法时,该方法将被继承。所以你的 subclass 中的最终函数定义看起来像这样:
[Authorize(Policy = "Administrator")]
[Authorize(Policy = "All")]
public override Task<IActionResult> Delete(int id)
所以这条路线现在有两个政策。这是一个问题,因为政策旨在累积。因此 所有 策略必须通过才能使身份验证成功。
当然,这对你不起作用,因为你实际上想从 base class 中“洗掉”原始策略。但这不可能,因此您必须从基础 class 中删除该策略,并可能为这些策略引入第二个仅限管理员的 class。
这里的普遍问题是您的策略设计似乎是基于角色。您正在使用策略,但实际上,您正在检查那里的角色。相反,您应该考虑处理需求:例如,要删除某些内容,用户需要满足“DeletionAllowed”需求。这允许更细粒度的策略系统。最大的好处是什么?需求处理者是分离的:所以一个能够满足需求的处理者就足以通过它。