授权操作过滤器和授权过滤器有啥区别?

Posted

技术标签:

【中文标题】授权操作过滤器和授权过滤器有啥区别?【英文标题】:What is the difference between Authorize Action filter and Authorization filter?授权操作过滤器和授权过滤器有什么区别? 【发布时间】:2016-10-27 23:59:47 【问题描述】:

根据ASP.NET website

ASP.NET MVC 框架包括几个动作过滤器:

    OutputCache - 此操作过滤器将控制器操作的输出缓存一段指定的时间。 HandleError – 此操作过滤器处理控制器操作执行时引发的错误。 授权 - 此操作过滤器使您能够限制对特定用户或角色的访问。

另外,MVC 中有一种过滤器叫做“授权过滤器”。

我很困惑 [Authorize] 属性是操作过滤器还是授权过滤器?什么时候执行?

【问题讨论】:

【参考方案1】:

授权操作过滤器和授权过滤器有什么区别?

无。

该文档显然不正确(如果您在目录中注明,它适用于 MVC 的版本 1 和 2,因此它也已过时)。

AuthorizeAttribute继承IAuthorizationFilter,所以它实际上是一个授权过滤器,而不是一个动作过滤器。 MVC 中没有授权操作过滤器。

请注意,对于 MVC 3 到 MVC 5,您应该在以后参考最新的 Filtering in ASP.NET MVC 文档。

什么时候执行?

根据MSDN:

过滤器按以下顺序运行:

    授权过滤器 动作过滤器 响应过滤器 异常过滤器

【讨论】:

【参考方案2】:

我很困惑 [Authorize] 属性是动作过滤器还是 授权过滤器?

[Authorize] 属性是一个授权过滤器,通过查看它的源代码可以看出。如果仔细观察,它实现了IAuthorizationFilter 接口,并根据文档将其归类为授权过滤器。

namespace System.Web.Mvc

    //
    // Summary:
    //     Specifies that access to a controller or action method is restricted to users
    //     who meet the authorization requirement.
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter
.........

什么时候执行?

根据文档:

过滤器按上面列出的顺序执行。例如, 授权过滤器总是在操作过滤器之前执行和 异常过滤器总是在所有其他类型的 过滤器。

查看当前在 MVC 中进行过滤的文档:https://msdn.microsoft.com/en-us/library/gg416513(VS.98).aspx

它明确指出 [Authorize] 属性是一个授权过滤器:

AuthorizeAttribute 类和 RequireHttpsAttribute 类是 授权过滤器的示例。授权过滤器在之前运行 任何其他过滤器。

【讨论】:

我看过源代码,就在那时我感到困惑。因为根据 ASP.NET 网站 asp.net/mvc/overview/older-versions-1/controllers-and-routing/… ,ASP.NET MVC 框架包括几个操作过滤器: - 授权 - 此操作过滤器使您能够限制对特定用户或角色的访问。 我相信这个文档已经过时了。看看这里:msdn.microsoft.com/en-us/library/gg416513(VS.98).aspx - 它清楚地表明 Authorize 属性是一个授权过滤器。

以上是关于授权操作过滤器和授权过滤器有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

MVC过滤器:自定义授权过滤器

[Core]Asp.Net Core中的各种过滤器(授权资源操作结果异常)

[Core]Asp.Net Core中的各种过滤器(授权资源操作结果异常)

在 JSF 项目中使用授权过滤器进行自定义身份验证

MVC中的授权过滤器

Spring Security源码(一):认证、授权、过滤器链