我有一个有两个过滤器的MVC Core应用程序。一个是检查角色成员身份的AuthorizeFilter
,另一个是验证应用程序和数据库是否同步的ActionFilter
。
启动.cs:
services.AddMvc()
.AddMvcOptions(options =>
{
options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().AddRequirements(new RoleRequirement()).Build()));
options.Filters.Add(new DatabaseFilter());
})
如果不匹配,ActionFilter
将返回显示错误消息的视图。
数据库过滤器.cs:
public void OnActionExecuting(ActionExecutingContext context)
{
if (condition)
{
context.Result = new ViewResult
{
ViewName = "DbError"
};
}
}
角色要求.cs:
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, RoleRequirement requirement)
{
if (condition)
{
context.Succeed(requirement);
}
else
{
context.Fail();
}
return;
}
正在发生的情况是,如果未经授权的用户在数据库不匹配时使用应用程序,则会显示数据库错误视图,而不是像没有数据库不匹配时那样获得 403 禁止响应。我希望他们收到禁止的消息。
根据文档,AuthorizationFilter
在ActionFilter
之前运行,但即使在设置context.Fail()
后,它也不能使请求短路。
回到这个问题之后,它变得很明显。授权过滤器正在使请求短路...然后定向到错误控制器操作以返回自定义 403 页面。错误控制器没有授权,因此它会下降到 DatabaseFilter,后者按预期返回不匹配错误。