Основано на 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();
}
Я не могу представить себе сценарий, при котором переключение от реализации белого списка до реализации черного списка имеет смысл. –
Я не хочу, чтобы мои администраторы обращались к контроллерам, связанным с клиентом, но мне, очевидно, нужны неавторизованные пользователи и клиенты. – ajbeaven
Существует много случаев, когда это имеет смысл, и большинство систем авторизации включают поддержку отказа. Рассмотрим сценарий, когда все пользователи имеют разрешение на выполнение чего-либо, кроме членов определенной роли. – ShadowChaser