AllowAnonymous是否覆盖AuthorizeAttribute

时间:2014-04-09 07:09:09

标签: asp.net asp.net-mvc

我试图阻止特定角色的特定用户(比如RoleA)访问特定操作。允许匿名用户访问,但不允许RoleA中的用户访问该操作。

所以我做了这样的事情:

[AllowAnonymous]
[CustomAuthorize(Roles="RoleB,RoleC")]
public ActionResult MyAction(){
  //irrelevant
}

但是,当CustomAuthorize存在时,永远不会点击[AllowAnonymous]操作过滤器。

[AllowAnonymous]覆盖[CustomAuthorize]吗?

5 个答案:

答案 0 :(得分:1)

这应该很容易实现。

删除[AllowAnonymous]属性并使用自定义授权属性:

[CustomAuthorize]
public ActionResult MyAction(){
  //irrelevant
}

并在您的CustomAuthorize过滤器中检查用户是否属于“RoleA”,如果是,则限制访问,否则允许访问。

答案 1 :(得分:1)

一种万无一失的方法是编写自己的属性并从AuthorizeAttribute继承它。实施是微不足道的。

public class RestrictRoleAttribute : AuthorizeAttribute
{
        public RestrictRoleAttribute()
        {

        }
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            string[] roles = Roles.Split(',');

            // Test if current user belongs into restricted role
            foreach (string r in roles)
            {
                if (httpContext.User.IsInRole(r))
                    return false;
            }

            return true;
        }
}

用法:

[RestrictRole(Roles="RoleB,RoleC")]
public ActionResult MyAction(){
  //irrelevant
}

答案 2 :(得分:0)

我不是100%肯定,但情况可能如此。如果您考虑控制器级别上的[Authorize]属性,那么[AllowAnonymous]将覆盖它,因此它优先于它。

您是否可以尝试将它们与地点交换,以便[CustomAuthorize]位于顶部以查看结果?

此致

答案 3 :(得分:0)

我最后写了一个deny属性:

public class DenyUserAttribute : CustomAuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return !base.AuthorizeCore(httpContext);
    }
}

答案 4 :(得分:0)

回答所要求的问题(有点晚了,但是嘿对某人可能有用):

AllowAnonymous具有以下描述:

  

表示一个属性,该属性标记控制器和操作以跳过   授权过程中的AuthorizeAttribute。

因此,将其与authorize属性一起添加将导致授权代码完全无法运行。

这还会产生影响,如果将其作为一个属性整体添加到控制器上(即在类级别),则将单个Authorize属性添加到该控制器上的操作将无效。