0

В настоящее время у меня есть система, в которой есть таблица пользователя, таблица ролей и таблица ассоциаций пользователей и ролей, где один пользователь может быть связан с несколькими ролями (например, Admin, BasicUser и т. Д.). Я могу авторизовать методы действий, основанные на этих ролях. Это из системы Identity.Как установить привилегию внутри роли в ASP.NET MVC?

Теперь я хочу добавить поддержку привилегий, чтобы методы действий могли быть ограничены и на основе этих, а не только по ролям. Например, в контроллере у меня может быть действие HTTPPost, которое может успешно выполнить только тот, у кого есть привилегия «Write».

Какие изменения мне нужно сделать, чтобы назначить привилегии для ролей? I.E., я хочу выбрать роль «Admin», чтобы иметь привилегии «Write» и «Read», а роли «BasicUser» будет присвоена только привилегия «Чтение». Таким образом, администратор может получить доступ к любому методу, разрешенному привилегией записи, в то время как BasicUser не может.

Если мне нужно создать другую таблицу под названием «Привилегия» и таблицу ассоциаций между ней и ролями и код для установки привилегий в роли, как я могу использовать эту привилегию в качестве фильтра? Так, например, действие ниже должно разрешаться только пользователем, выполняющим роль, которая имеет привилегию «Write», приписываемую ему.

[Write] 
public ActionResult Create() 
{ 
    return View(); 
} 

спасибо.

ответ

1

Точно так же как AuthorizeAttribute работы, вы можете создать атрибут пользовательского авторизации, унаследованный от него:

public class AuthorizePrivilegeAttribute : AuthorizeAttribute 
{ 
    // Custom property 
    public string Privilege { get; set; } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     // Reusing default authentication. 
     var isAuthorized = base.AuthorizeCore(httpContext); 
     if (!isAuthorized) 
     {     
      return false; 
     } 

     return YourCustomCode.HasPrivilege(this.Privilege))  
    } 
} 

Затем, используя его на верхней части вашего метода:

[AuthorizePrivilege(Privilege = "Write")] 
public ActionResult Create() 
{ 
    return View(); 
} 
+0

Спасибо за отправную точку. Используя этот метод, будет ли класс YourCustomCode содержать код, который проверяет связь между ролью и привилегией? И.Е. весь код базы данных? – ITWorker

+0

Точно! Не забывайте отмечать как ответ, если вы удовлетворены ответом. – bsoulier

 Смежные вопросы

  • Нет связанных вопросов^_^