首页 > 解决方案 > 如何覆盖(不组合)每个方法的授权属性

问题描述

我有一个自定义AuthorizeAttribute(假设它称为MyAuthorizeAttribute1),我想将其应用于我的 WebAPI2 应用程序中的几乎所有方法,因此我已将其添加到我的WebApiConfig.cs文件中:

config.Filters.Add(new MyAuthorizeAttribute1());

对于我希望允许匿名访问的少数端点,我将使用[AllowAnonymous].

但是,我想将不同的、限制性稍小的自定义AuthorizeAttribute( MyAuthorizeAttribute2 ) 应用于单个方法,但我不知道如何解决。

如果我这样做:

[MyAuthorizeAttribute2]
public HttpActionResult GetList()
{
    ....
}

然后MyAuthorizeAttribute1MyAuthorizeAttribute2中的断点都会被命中,这是预期的,因为授权属性是相加的(当多个属性应用于方法时,它们会组合在一起)。

我想我可能能够AuthorizeAttribute在控制器级别覆盖 main ,然后在方法级别应用限制较少的一个,如下所示:

[AllowAnonymous]
public class StudentsController : ApiController
{
    [MyAuthorizeAttribute2]
    public HttpActionResult GetList()
    {
        ....
    }
}

但这似乎告诉该GetList()方法允许匿名访问(我猜它是将AllowAnonymous属性与结合起来MyAuthorizeAttribute2,其组合效果是允许匿名访问)。

WebApiConfig.cs我意识到我可以通过从每个控制器的顶部删除行并应用MyAuthorizeAttribute1来实现我想要做的事情,除了我想使用MyAuthorizeAttribute2的那个,然后用适当的装饰该控制器中的每个方法授权属性。

但是,如果可能的话,我宁愿保留授权过滤器,WebApiConfig.cs因为这样我自己或其他开发人员将来意外创建一个过度访问的端点的危险很小。

AuthroizeAttribute那么,是否有可能用一个覆盖一个集合而不是与它结合方法来装饰一个方法?WebApiConfig.cs

(以防万一它与任何人的答案相关,MyAuthorizeAttribute1实际上是从MyAuthorizeAttribute2派生的,派生类添加了额外的授权级别)。

标签: c#asp.net-web-apiasp.net-web-api2asp.net-authorization

解决方案


推荐阅读