.Net核心在继承的控制器中授权属性

时间:2017-09-12 06:44:18

标签: asp.net-core claims-based-identity

我在授权政策方面遇到了一些麻烦。我有一个带动作的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){}

普通用户似乎无法访问此操作。我是否必须在策略配置中进一步搜索错误,或者由于控制器是继承的,是否忽略了它的属性?

由于

1 个答案:

答案 0 :(得分:2)

AuthorizeAttribute是一个继承的属性,允许自己多次应用。

这意味着在继承已经具有AuthorizeAttribute的方法时,将继承该方法。因此,子类中的最终函数定义如下所示:

[Authorize(Policy = "Administrator")]
[Authorize(Policy = "All")]
public override Task<IActionResult> Delete(int id)

所以该路线现在有两个政策。这是一个问题,因为策略是累积的。因此,所有策略必须通过才能使身份验证成功。

当然,这对您不起作用,因为您实际上想要从基类中“清除”原始策略。但这是不可能的,因此您必须从基类中删除该策略,并且可能为这些策略引入第二个仅限管理员的类。

这里的一般问题是您的策略设计似乎基于角色。您正在使用策略,但实际上,您正在检查其中的角色。相反,您应该考虑使用需求:例如,要删除某些内容,用户需要满足“DeletionAllowed”要求。这允许更细粒度的策略系统。最大的好处是什么?需求处理程序是分离的:因此,一个能够满足要求的处理程序就足以传递它。

相关问题