当我们扩展Authorize属性时,我在理解授权如何在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属性,而是应该使用新的基于策略的授权吗?
答案 0 :(得分:1)
不,默认行为将保持不变,未经授权的请求将重定向到登录。
要在整个应用程序中使用该属性,您需要注册过滤器,这就是将其添加到全局过滤器列表时会发生的情况。
对于这个问题,不确定是否存在令人不快的答案,IMO应根据您的要求而非规则做出决定。根据我的经验,即使基于声明/角色的授权可以在系统具有不同角色时简化操作,并且可以基于角色访问应用程序的某些部分。但是在单个或少数用户场景的情况下,使用自定义授权总是很快。
答案 1 :(得分:1)
您拥有2个独立的动作过滤器。通过将新过滤器注册为全局过滤器,您只需将其用于应用中的所有操作即可。
使用原始设置,两个过滤器都将执行。如果要控制它们执行的顺序,可以查看Order和Scope属性;更多信息:In what order are filters executed in asp.net mvc
另外,如果我可以使用[AuthExtend]简单地修饰我的动作方法,为什么还需要将扩展名添加到全局过滤器列表?
这取决于你想做什么。您的全局过滤器将针对所有操作执行。通常,您只会使用扩展属性,我不明白为什么要使用这两个属性。 不确定自定义过滤器的实现方式以及如何设置身份验证,但过滤器全局注册了用户如何登录(因为他们需要被授权访问登录页面)?
我认为最好只使用自定义过滤器并根据需要将其添加到控制器和/或操作之上。
对于较新的MVC应用程序,我们不应该扩展Authorize属性,而是应该使用新的基于策略的授权吗?
我不认为基于策略的授权和创建自定义操作过滤器是互斥的。