首页 > 解决方案 > ASP.NET Core MVC ActionFilter 在 AuthorizationFilter 之前执行

问题描述

在我的网站上,我有一些controller仅限于经过身份验证的用户使用。除此之外,还有一些需要身份验证的控制器,也需要根据一年中的时间进行限制。

为了解决这个问题,我创建了一个TimeRangeFilter ActionFilter/ ResourceFilter

这是它的样子:

public class TimeRangeFilter : Attribute, IActionFilter, IOrderedFilter
{
  public string AllowedMonths { get; set; } // like |3|4|5|
  public string RedirectUrl { get; set; }
  ...... // OnActionExecuting....
}

然后,在我Controller的 's上class,我这样实现:

[TimeRangeFilter(AllowedMonths = "|3|4|", RedirectUrl = "/feature/welcome", Order = 1)]
[Authorize]
[IsNotNefarious]
public class HubController : BaseController
{...}

但是,即使在IOrderedFilter interfacefilterAuthorizationFilter首先执行,然后是我的TimeRangeFilter

对于这个欢迎页面,我不想要求用户登录才能看到它。但我不想根据允许的月份更改访问我的 Hub 页面的 URL。

在执行之前,我如何优先考虑我的ActionFilter/ResourceFilter执行和短路AuthorizationFilter

标签: c#asp.net-coreasp.net-core-mvcaction-filter

解决方案


简短的回答是“你不能ActionFilter在之前执行AuhtorizeFilter”。但是你可以TimeRangeFilter变成授权过滤器

public class TimeRangeFilterAttribute : Attribute, IAuthorizationFilter, IOrderedFilter
{
    public string AllowedMonths { get; set; } // like |3|4|5|
    public string RedirectUrl { get; set; }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        if (not allowed) {
            context.Result = new RedirectResult(RedirectUrl);
        }
    }
}

指定Order = 0让它在其他Authorize检查之前运行,或者尝试为它实现IOrderedFilter它也将首先执行。


推荐阅读