首页 > 解决方案 > 当状态码设置为 .net core 2.1 时,授权过滤器继续开启

问题描述

在我的控制器方法上,我有:

public class HomeController : Controller
{
    [Authorisation(),HttpGet]
    public IActionResult Index()
    {
          return View("~/Views/Home/Index.cshtml");
    }
}

在我的授权过滤器中,我有:

public void OnAuthorization(AuthorizationFilterContext context)
{
   …..
   context.HttpContext.Response.StatusCode = StatusCodes.Status401Unauthorized;
            return;
   …..

当它在我的授权过滤器中命中上述代码时。代码仍然继续查看。如果我在即时窗口中执行以下操作,则在视图上放置断点:

this.ControllerContext.HttpContext.Response.StatusCode

它按预期返回401。

回到我的 startup.cs 文件中,我有:

app.Use(async (context, next) =>
{
    await next.Invoke();
    if (context.Response.StatusCode == 401)
    {
        context.Response.Redirect("/user/signin/");
    }
});

我不明白为什么控制器会在这种情况下继续查看视图。

标签: c#asp.net-coreasp.net-core-mvc

解决方案


为了触发过滤器管道的授权短路行为,您需要Result过滤器上下文上设置:

获取或设置请求的结果。在授权过滤器内将 Result 设置为非null值将使过滤器管道的其余部分短路。

所以你的过滤器应该做这样的事情:

public void OnAuthorization(AuthorizationFilterContext context)
{
    // …
    context.Result = new StatusCodeResult(StatusCodes.Status401Unauthorized);
}

您也可以直接使用 aUnauthorizedResult代替:

context.Result = new UnauthorizedResult();

顺便提一句。我建议您查看 ASP.NET Core 文档的安全章节。该框架附带的身份验证和授权堆栈非常强大,您可能可以利用它直接实现您想要在那里做的事情。如果设置正确,例如重定向到登录页面是默认情况下出现的。


推荐阅读