2009-09-04 25 views
6

Yetkilendirme filtresi, bir denetleyiciye veya eyleme erişebilen belirli bir kullanıcı grubuna izin verir:ASP.NET MVC: [Yetkilendirenin]

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

Bunun yerine, 'in erişemediği bir kullanıcı grubu belirtip belirtmediğini öğrenmek isterim. denetleyici veya eylem.

+1

Ben bir senaryo hayal edemiyorum beyaz liste uygulamasından kara liste uygulamasına kadar anlamlı olacaktır. –

+0

Yöneticilerimin müşteri ile ilgili denetleyicilere erişmesini istemiyorum, ancak kesinlikle yetkili olmayan kullanıcılara ve Müşteriler'e gereksinim duyuyorum. – ajbeaven

+0

Bunun anlamlı olduğu birçok durum vardır ve çoğu yetkilendirme sistemi inkar için destek içerir. Tüm kullanıcıların belirli bir rolün üyeleri dışında bir şey yapma izninin olduğu bir senaryo düşünün. – ShadowChaser

cevap

5
Ben twk önerisine sonra kendi AuthorizationAttribute oluşturma çalıştı

:

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; 
    } 
} 

Ve bu gibi kullanmak:

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

Ben olmadığından emin değilim Doğru uygulama ama işi yapıyor.

+0

bana iyi görünüyor! :) – jeef3

+0

Kısıtlama özelliğiniz aynı anda birden fazla rolü kabul ediyor mu? – twk

+0

+1 Güzel basit çözüm – CmdrTallen

1

Böyle bir özelliği uygulayabilen kendi ActionFilter'inizi hazırlamalısınız. Varsayılan olarak, her şeyi reddetme kuralı vardır, ancak Yetkilendir eylemi süzgeciyle (zaten bildiğiniz gibi) tanımlanmış bir izin vardır.

Bazı ilham bulunabilir there

1

ajbeaven's answer dayanarak, bir rol yerine Roller listesine genişletmeyi başardım.

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; 
    } 
} 

Sonra bütün çözüm yeniden kullanılabilir kılınması AppRoles sınıfını ekleyin::

Öncelikle sınıf sınırla

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

Kullanımı: anahtarlama nerede

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