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();
}
Ich kann kein Szenario vorstellen, in dem Schalt von einer White-List-Implementierung zu einer Black-List-Implementierung wäre sinnvoll. –
Ich möchte nicht, dass meine Administratoren auf die kundenbezogenen Controller zugreifen, aber ich brauche natürlich nicht autorisierte Benutzer und Kunden. – ajbeaven
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