【问题标题】:.Net core Authorize attribute in inherited controller.Net core Authorize 继承控制器中的属性
【发布时间】:2017-09-12 06:44:17
【问题描述】:

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

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

谢谢

【问题讨论】:

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


    【解决方案1】:

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

    这意味着当继承你已经有AuthorizeAttribute 的方法时,它将被继承。所以子类中的最终函数定义如下所示:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-11-24
      • 2014-11-27
      • 1970-01-01
      • 2014-09-17
      • 1970-01-01
      • 2014-06-14
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多