【问题标题】:ASP.NET Core MVC ActionFilter executing after Authorization fails授权失败后执行 ASP.NET Core MVC 操作筛选器
【发布时间】:2018-03-29 12:28:17
【问题描述】:

我有一个包含两个过滤器的 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 响应那样获得 403 Forbidden 响应数据库不匹配。我希望他们收到禁止的消息。

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

【问题讨论】:

  • 你能找到“根据文档”的来源吗?
  • 添加了对文档的引用。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 2021-06-02
    • 2020-06-28
    • 2010-12-18
    • 2018-08-25
    • 2013-10-09
    相关资源
    最近更新 更多