2009-09-04 128 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(); 
}