2009-09-04 23 views
6

Der authorise Filter können Sie bestimmte Gruppe von Benutzern, die einen Controller oder Aktion zugreifen:ASP.NET MVC: Gegenüber von [autorisieren]

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

Ich mag würde wissen, ob es möglich ist, anstelle , geben Sie eine Gruppe von Benutzern an, die nicht Zugriff auf einen Controller oder eine Aktion haben können.

+1

Ich kann kein Szenario vorstellen, in dem Schalt von einer White-List-Implementierung zu einer Black-List-Implementierung wäre sinnvoll. –

+0

Ich möchte nicht, dass meine Administratoren auf die kundenbezogenen Controller zugreifen, aber ich brauche natürlich nicht autorisierte Benutzer und Kunden. – ajbeaven

+0

Es gibt viele Fälle, in denen es Sinn macht, und die meisten Autorisierungssysteme enthalten Unterstützung für die Verweigerung. Stellen Sie sich ein Szenario vor, in dem alle Benutzer die Berechtigung haben, etwas zu tun, mit Ausnahme von Mitgliedern einer bestimmten Rolle. – ShadowChaser

Antwort

5

Ich habe versucht, die Schaffung meine eigene AuthorizationAttribute nach TWK Vorschlag zu finden:

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

Und ich benutze es wie folgt aus:

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

Ich bin nicht sicher, ob es ist richtige Praxis, aber es macht den Job.

+0

sieht gut aus für mich! :) – jeef3

+0

Akzeptiert Ihr Einschränkungsattribut mehr als eine Rolle gleichzeitig? – twk

+0

+1 Schöne einfache Lösung – CmdrTallen

1

Sie sollten Ihren eigenen ActionFilter vorbereiten, der eine solche Funktion implementieren kann. Standardmäßig gibt es eine Regel, alles zu leugnen, aber durch den Autorisierungs-Aktionsfilter definiert zu lassen (wie Sie bereits wissen).

können Einige Inspiration there

1

Basierend auf ajbeaven's answer, konnte ich es auf eine Liste von Rollen statt einer Rolle erweitern.

Erstens die Restrict Klasse:

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

dann die AppRoles Klasse fügen Sie die gesamte Lösung wiederverwendbar zu machen:

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

Verbrauch:

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