c# - 当状态码设置为 .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/");
}
});
我不明白为什么控制器会在这种情况下继续查看视图。
解决方案
为了触发过滤器管道的授权短路行为,您需要Result
在过滤器上下文上设置:
获取或设置请求的结果。在授权过滤器内将 Result 设置为非
null
值将使过滤器管道的其余部分短路。
所以你的过滤器应该做这样的事情:
public void OnAuthorization(AuthorizationFilterContext context)
{
// …
context.Result = new StatusCodeResult(StatusCodes.Status401Unauthorized);
}
您也可以直接使用 aUnauthorizedResult
代替:
context.Result = new UnauthorizedResult();
顺便提一句。我建议您查看 ASP.NET Core 文档的安全章节。该框架附带的身份验证和授权堆栈非常强大,您可能可以利用它直接实现您想要在那里做的事情。如果设置正确,例如重定向到登录页面是默认情况下出现的。
推荐阅读
- android - 如何在我的输入搜索开始的sqlite句子中找到单词?
- vue.js - 如何直接注册组件 vuetify-date-range picker ?无法获取自定义元素
- php - 在 WooCommerce 中隐藏未登录用户的特定产品
- javascript - 清除 Javascript 画布上的文本
- java - 在 Java Spring-Boot 上启动 ApplicationContext 时出错
- c# - 文本框文本到达文本框末尾时“消失”
- javascript - 是否可以从 .wav 文件创建 MediaStream?
- python - 无法理解 uniform_filter1d() 函数的工作原理(从 scipy.ndimage.filters 导入)
- java - RDF4j .ttl 文件过滤器 IF 语句
- python-3.x - 尝试使用烧瓶构建应用程序,但在提交按钮时出现 404 页面未找到错误