使用OnAuthorization进行.net mvc授权

时间:2016-06-29 07:21:46

标签: asp.net-mvc authorization

在我的基本控制器中,我有一个OnAuthorization事件处理程序,在我的控制器中,我有处理程序,有时候有[Authorize],有时没有。这些控制器继承自基本控制器。

我希望在实际需要授权时触发OnAuthorization(方法或控制器具有[Authorize]

情况并非如此,并且每个方法都会触发OnAuthorization。

有没有办法防止这种情况发生或检测不具有[Authorize]属性的方法/类?

目前我只想授权5个或25个左右的处理程序,所以只需一个方法就可以处理它而不必更改所有控制器。

2 个答案:

答案 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实例而不是控制器实例。 AuthorizeAttributeIAuthorizationFitlerFilterAttribute。当您将它放在一个操作方法上时,它registers with the framework就会仅对该操作方法执行。另一方面,控制器IAuthorizationFilteralways registered globally,因此它会在每个请求上运行。这两个授权过滤器完全没有意识到彼此。

  

另外,你应该在MVC中never use a base controller class。对于横切关注点,您可以使用全局注册的过滤器。这就是OnAuthorization方法在控制器中的工作方式 - 它是一个全局过滤器。但是,您可以将横切代码分离为过滤器类,这些过滤器类更加灵活,并且与控制器松散耦合。有关详细说明和示例,请参阅this answer

答案 1 :(得分:0)

您可以使用[AllowAnonymous]

排除特定操作/方法的授权

示例:

[AllowAnonymous] public ActionResult MyAction() { }