2009-09-04 131 views
6

的授权过滤器,可以指定用户组可以访问控制器或动作:ASP.NET MVC:[授权]的对面

[Authorize(Roles="Administrator")] 
public class HomeController : Controller 
{ 
    // code 
} 

我想知道这是否是可能的,而不是,指定一组用户不能访问控制器或操作。

+1

我无法想象这样一个场景切换从白名单实施到黑名单实施将是有意义的。 – 2009-09-04 00:13:41

+0

我不希望我的管理员访问与客户相关的控制器,但我显然需要非授权用户和客户才能够。 – ajbeaven 2009-09-04 00:27:23

+0

有很多情况下,它是有道理的,并且大多数授权系统都包含对拒绝的支持。考虑一种情况,即所有用户都有权执行除特定角色成员以外的任何操作。 – ShadowChaser 2012-07-01 03:05:28

回答

5

我试着TWK的建议后,创造我自己的AuthorizationAttribute:

public class Restrict : AuthorizeAttribute 
{ 
    private readonly string _role; 

    public Restrict(string role) 
    { 
     _role = role; 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     if (httpContext == null) 
      throw new ArgumentNullException("httpContext"); 

     if (httpContext.User.IsInRole(_role)) 
      return false; 

     return true; 
    } 
} 

我用它是这样的:

[Restrict("Administrator")] 
public class HomeController : Controller 
{ 
    // code 
} 

我不确定是否这是正确的做法,但它做到了这一点。

+0

对我来说很好! :) – jeef3 2009-09-04 02:54:18

+0

您的“限制”属性是否同时接受多个角色? – twk 2009-09-04 15:38:43

+0

+1非常简单的解决方案 – CmdrTallen 2009-09-04 18:01:53

1

你应该准备你自己的ActionFilter,它可以实现这样的功能。 默认情况下,存在拒绝所有内容的规则,但允许通过授权操作筛选器进行定义(如您所知)。

一些灵感,可以发现there

1

根据ajbeaven's answer,我设法将其扩展到角色列表而不是一个角色。

首先,将限制类:

public class Restrict : AuthorizeAttribute { 
    private List<string> _roles; 
    public string Roles { 
     get { 
      string roles = ""; 
      if (_roles != null && _roles.Count > 0) { 
       int counter = 0; 
       foreach (string role in _roles) { 
        counter++; 
        if (counter == _roles.Count) { 
         roles = role; 
        } else { 
         roles += role + ","; 
        } 
       } 
      } 
      return roles; 
     } 
     set { 
      _roles = new List<string>(); 
      string[] roles = value.Split(','); 
      foreach (string role in roles) { 
       _roles.Add(role); 
      } 
     } 
    } 

    public Restrict() { 
     _roles = new List<string>(); 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) { 
     bool result = true; 
     if (httpContext == null) { 
      throw new ArgumentNullException("httpContext"); 
     } 
     foreach (string role in _roles) { 
      if (httpContext.User.IsInRole(role)) { 
       result = false; 
       break; 
      } 
     } 
     return result; 
    } 
} 

然后添加AppRoles类,使整个解决方案可重复使用:

public static class AppRoles { 
    public const string Role1 = "Role1"; 
    public const string Role2 = "Role2"; 
} 

用法:

[Authorize] 
[Restrict(Roles = AppRoles.Role1 + "," + AppRoles.Role2)] 
    public ActionResult Index() { 
    return View(); 
}