自定义 MVC 授权如何工作?

How does custom MVC Authorization work?

当我们扩展 Authorize 属性时,我在理解 Authorization 在 MVC 中的工作方式时遇到了一些问题。

所以在代码中我们像这样扩展了 AuthorizeAttribute:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class AuthExtendAttribute : AuthorizeAttribute

然后我们将扩展添加到全局过滤器列表中,如下所示:

filters.Add(new AuthExtendAttribute());

然后使用 Authorize 属性修饰操作方法,如下所示:

[Authorize]
public bool DoStuff()

我的问题是,这个新扩展会取代 [Authorize] 属性的默认行为,还是框架仍会使用默认行为,然后调用 AuthExtendAttribute?

此外,如果我可以简单地用 [AuthExtend] 装饰我的操作方法,为什么我需要将扩展​​添加到全局过滤器列表?

对于较新的 MVC 应用程序,我们不应该扩展 Authorize 属性,而是应该使用新的基于策略的授权,这也是真的吗?

  1. 不,默认行为将保持不变,未经授权的请求将被重定向到登录。

  2. 为了在整个应用程序中使用该属性,您需要注册过滤器,这就是将其添加到全局过滤器列表时发生的情况。

  3. 不确定这个问题是否有确切的答案,IMO 应该是根据您的要求而不是规则做出的决定。根据我的经验,即使基于声明/角色的授权在系统具有不同角色时简化了事情,并且基于角色访问应用程序的某些部分。但在单个或少数用户场景的情况下,使用自定义授权总是很快。

您拥有的是 2 个独立的操作过滤器。通过将您的新过滤器注册为全局过滤器,您只需让它可用于您应用中的所有操作。

使用您的原始设置,两个过滤器都会执行。如果您想控制它们的执行顺序,您可以查看 Order 和 Scope 属性;更多信息在这里:In what order are filters executed in asp.net mvc

Also, why would I need to add the extension to the global filter list if I could simply decorate my action methods with [AuthExtend]?

这取决于你想做什么。您的全局过滤器将执行所有操作。通常,您只会使用扩展属性,我不明白您为什么要同时使用两者。 不确定您的自定义过滤器是如何实施的以及您的身份验证是如何设置的,但是在全局注册过滤器的情况下,用户将如何登录(因为他们需要获得授权才能访问登录页面)?

我认为最好只使用自定义过滤器并根据需要将其添加到控制器 and/or 操作之上。

Is it also true that with newer MVC applications we shouldn't be extending the Authorize attribute but rather we should be using the new Policy based authorization?

我不认为基于策略的授权和创建自定义操作过滤器是相互排斥的。