授权后执行的ASP.NET Core MVC ActionFilter失败

时间:2017-10-17 18:06:49

标签: asp.net asp.net-core asp.net-core-mvc

我有一个MVC Core应用程序,它有两个过滤器。一个是AuthorizeFilter来检查角色成员资格,另一个是ActionFilter来验证应用程序和数据库是否同步。

Startup.cs:

services.AddMvc()
        .AddMvcOptions(options =>
        {
            options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().AddRequirements(new RoleRequirement()).Build()));
            options.Filters.Add(new DatabaseFilter());
        })

如果不匹配,ActionFilter将返回显示错误消息的视图。

DatabaseFilter.cs:

public void OnActionExecuting(ActionExecutingContext context)
{
    if (condition)
    {
        context.Result = new ViewResult
        {
            ViewName = "DbError"
        };
    }
}

RoleRequirement.cs:

protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, RoleRequirement requirement)
{
    if (condition)
    {
        context.Succeed(requirement);
    }
    else
    {
        context.Fail();
    }

    return;
}

正在发生的是如果未经授权的用户在数据库不匹配时使用该应用程序,则会显示数据库错误视图而不是获取403 Forbidden响应,如果没有数据库不匹配。我宁愿他们收到禁止的消息。

According to the documentationAuthorizationFilterActionFilter之前运行,但即使在设置context.Fail()之后也不能将请求短路。

1 个答案:

答案 0 :(得分:0)

回到这一点后,很明显。授权过滤器 使请求短路...然后指向错误控制器操作以返回自定义403页面。错误控制器没有授权,因此它会下降到DatabaseFilter,它会返回不匹配的错误。