在我的基本控制器中,我有一个OnAuthorization事件处理程序,在我的控制器中,我有处理程序,有时候有[Authorize]
,有时没有。这些控制器继承自基本控制器。
我希望在实际需要授权时触发OnAuthorization(方法或控制器具有[Authorize]
。
情况并非如此,并且每个方法都会触发OnAuthorization。
有没有办法防止这种情况发生或检测不具有[Authorize]
属性的方法/类?
目前我只想授权5个或25个左右的处理程序,所以只需一个方法就可以处理它而不必更改所有控制器。
答案 0 :(得分:2)
请参阅Filtering in MVC。
MVC控制器OnAuthorization
方法的功能是因为Controller类实现了IAuthorizationFilter
而MVC使用ControllerInstanceFilterProvider
将所有控制器注册为全局过滤器。
全局授权过滤器在每个请求上运行。由您决定是否有资格进行授权检查。如果您希望在AuthorizeAttribute
不存在时运行授权,则需要添加一个条件来检查AuthorizeAttribute
是否存在,如果存在,则跳过自定义授权检查。
protected override void OnAuthorization(AuthorizationContext filterContext)
{
bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AuthorizeAttribute), inherit: true)
|| filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AuthorizeAttribute), inherit: true);
if (skipAuthorization)
{
return;
}
// Do your authorization here...
base.OnAuthorization(filterContext);
}
默认情况下不会发生这种情况的原因是AuthorizeAttribute
是{em}不同的IAuthorizationFilter
实例而不是控制器实例。 AuthorizeAttribute
是IAuthorizationFitler
和FilterAttribute
。当您将它放在一个操作方法上时,它registers with the framework就会仅对该操作方法执行。另一方面,控制器IAuthorizationFilter
是always registered globally,因此它会在每个请求上运行。这两个授权过滤器完全没有意识到彼此。
另外,你应该在MVC中never use a base controller class。对于横切关注点,您可以使用全局注册的过滤器。这就是
OnAuthorization
方法在控制器中的工作方式 - 它是一个全局过滤器。但是,您可以将横切代码分离为过滤器类,这些过滤器类更加灵活,并且与控制器松散耦合。有关详细说明和示例,请参阅this answer。
答案 1 :(得分:0)
您可以使用[AllowAnonymous]
排除特定操作/方法的授权示例:
[AllowAnonymous]
public ActionResult MyAction()
{
}