我试图阻止特定角色的特定用户(比如RoleA)访问特定操作。允许匿名用户访问,但不允许RoleA中的用户访问该操作。
所以我做了这样的事情:
[AllowAnonymous]
[CustomAuthorize(Roles="RoleB,RoleC")]
public ActionResult MyAction(){
//irrelevant
}
但是,当CustomAuthorize
存在时,永远不会点击[AllowAnonymous]
操作过滤器。
[AllowAnonymous]
覆盖[CustomAuthorize]
吗?
答案 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属性添加到该控制器上的操作将无效。