gpt4 book ai didi

c# - 让 Filter.OnAuthorization 在 Controller.OnAuthorization 之前运行

转载 作者:行者123 更新时间:2023-11-30 14:57:51 28 4
gpt4 key购买 nike

我有一个现有站点,该站点的所有 Controller 都有一个基 Controller 类,它覆盖了 OnAuthorization 的实现。在最简单的简化形式中:

protected override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
//Do Stuff
}

这一切都工作得很好,并且在正确的时间做它想做的事。我现在想添加一个新的全局授权,它将在所有其他授权属性之前运行。出于测试目的,此属性如下所示:

public class TestFilterAttribute : FilterAttribute, IAuthorizationFilter
{

public void OnAuthorization(AuthorizationContext filterContext)
{
var text = "debug point";
return;
}
}

并像这样添加到全局过滤器中:

filters.Add(new TestFilterAttribute());

我的问题是 Controller 的 OnAuthorization 似乎总是在我的过滤器之前运行。有什么办法可以改变这个吗?我试过使用 order 属性,您可以在将它添加到全局过滤器集合时设置它,但这似乎没有帮助。

当订单可能可用时,我可能会将 Controller 的 OnAuthorization 逻辑移动到新的过滤器属性中,但如果有更简单的方法,我宁愿避免主要代码重组。

我一直在搜索关于 Controller.OnAuthorization 方法的信息,但我找到的最好的是 http://msdn.microsoft.com/en-us/library/gg416513(v=vs.98).aspx它只谈论过滤器。我原以为它们在 Controller 上的工作方式相同,但它们似乎受到特殊对待,特别是不遵守顺序(甚至 int.MinValue 都不是第一个,所以它不仅仅是 Controller 默认情况下订单非常低)。

那么关于如何让身份验证过滤器作为第一件事运行有什么建议吗?

最佳答案

最终使用的解决方案是重构代码。我采用了所有可以在过滤器属性上运行的方法(例如 OnAuthorizationOnActionExecuting 等),并将它们移动到以它们来自的类命名的属性上。因此 BasicController 中的 OnAuthorization 变成了 BasicControllerAttribute 上的相同方法。

然后将这些属性应用于 Controller ,然后这些属性由所有从 BasicController 继承的类继承,这些类基本上保持相同的功能。

但是该属性可以设置其Order,这样您就可以随心所欲地调整运行顺序。

我从中得出的结论是永远不要覆盖 Controller 上的那些方法并始终使用属性。 :)

关于c# - 让 Filter.OnAuthorization 在 Controller.OnAuthorization 之前运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20098516/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com