ASP.NET 授权失败后执行的核心 MVC 操作筛选器



我有一个有两个过滤器的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 禁止响应。我希望他们收到禁止的消息。

根据文档,AuthorizationFilterActionFilter之前运行,但即使在设置context.Fail()后,它也不能使请求短路。

回到这个问题之后,它变得很明显。授权过滤器正在使请求短路...然后定向到错误控制器操作以返回自定义 403 页面。错误控制器没有授权,因此它会下降到 DatabaseFilter,后者按预期返回不匹配错误。

最新更新