【问题标题】:ASP.net MVC - Authorize controller for one user/role but all users for one actionASP.net MVC - 为一个用户/角色授权控制器,但为所有用户授权一项操作
【发布时间】:2015-05-07 14:26:08
【问题描述】:

我有一个这样的控制器:

[Authorize(Users="Admin")]
public class MyController : Controller
{
    ...

    [AllowAnonymous]
    public AllUsersAction()
    {

    }
}

除了我确实想授权AllUsersAction,只有所有授权用户才能点击它,而不仅仅是管理员。

怎么办?

编辑:我知道我可以授权整个控制器并为所有应该只对Admin 可用的操作提供更多限制。但我宁愿不要将属性放在每个动作上,而是一个。

这个问题可以更好地表述:如果目前不可能实现这种“极简主义”,应该是什么样的实现?

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    对控制器使用不带任何参数的 Authorize 属性:

    [Authorize]
    public class MyController : Controller
    {
        ...
        public AllUsersAction()
        {
    
        }
    
        [Authorize(Users="Admin")]
        public ActionResult OnlyForAdmin()
        {
        }
    
    }
    

    并为受限操作指定 Authorize 属性 Roles/Users 属性。

    不幸的是,仅当操作具有 AllowAnonymous 属性时,控制器上的 Authorize 属性才会绕过授权。幸运的是,如果操作有自己的 Authorize 属性,您可以覆盖 Authorize 属性的 OnAuthorization 方法以跳过控制器 Authorize 属性中的授权检查:

    public class CustomAuthorize : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            if(filterContext.ActionDescriptor.IsDefined(typeof(AuthorizeAttribute), true)) 
            {
                //skip authorization check if action has Authorize attribute
                return;
            }
    
            base.OnAuthorization(filterContext);
        }
    }
    

    您可以在示例中使用此 CustomAuthorize:

    [CustomAuthorize(Users="Admin")]
    public class MyController : Controller
    {
        ...
    
        [Authorize]
        public AllUsersAction()
        {
    
        }
    }
    

    【讨论】:

    • 对。我确实知道我可以做到这一点,但我所追求的是一种用尽可能少的代码来做到这一点的方法。我还可以将我的非管理员操作移动到另一个控制器。你知道我所要求的是否可以用当前的基础设施来完成?如果没有,实施一项可以满足我要求的改进会是什么样子?
    • MVC 中没有现成的解决方案。如果操作具有自己的 Authorize 属性,您可以覆盖 Authorize 属性的 OnAuthorization 方法以跳过授权。检查编辑。
    • 感谢您对近似它的方法的建议!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 2014-05-28
    • 2011-11-13
    • 2015-11-17
    • 2010-10-21
    相关资源
    最近更新 更多