ASP.NET Core MVC ActionFilter在AuthorizationFilter之前执行

问题描述 投票:0回答:1

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

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

这是它的样子:

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

然后,在我的Controllerclass上,我实现如下:

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

但是,即使IOrderedFilter上的interface filterAuthorizationFilter首先执行,然后我的TimeRangeFilter

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

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

c# asp.net-core asp.net-core-mvc action-filter
1个回答
1
投票

简短的回答是“你不能让ActionFilterAuhtorizeFilter之前执行”。但是你可以将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,它也将首先执行。

© www.soinside.com 2019 - 2024. All rights reserved.