c# - 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
interface
上filter
,AuthorizationFilter
首先执行,然后是我的TimeRangeFilter
。
对于这个欢迎页面,我不想要求用户登录才能看到它。但我不想根据允许的月份更改访问我的 Hub 页面的 URL。
在执行之前,我如何优先考虑我的ActionFilter
/ResourceFilter
执行和短路AuthorizationFilter
?
解决方案
简短的回答是“你不能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
它也将首先执行。
推荐阅读
- visual-studio-code - 如何将@jacksonized 的支持添加到对 VScode 的 lombok 注释支持
- python - Python中的zip耗尽迭代器
- coq - 在 Coq 中为全局范围添加符号
- php - 带有 acf 字段的页面上的 foreach 块
- php - Symfony 3.4 - 无法加载字段值
- excel - 如果条件满足Excel VBA,则循环遍历列并将一个单元格乘以一个数字
- r - 绑定列名和行名不同的两个数据框
- javascript - React-Router 渲染:函数作为 React 子级无效
- css - 如何将样式应用于多个类的道具?
- html - 仅使用 HTML 指定表中的行数