2016-06-09 6 views
0

Этот вопрос действительно относится к любому веб-сайту или корпоративной системе, где одному пользователю может быть назначено несколько ролей.На сайте ASP.NET следует назначить администраторам несколько ролей?

В идентификаторе ASP.NET у вас есть IdentityUser и IdentityRole, где пользователь может иметь 0 или более ролей. действия контроллера затем защищены [Authorize(Roles = "roleName")]

Учитывая простую концептуальную систему, которая имеет 3 простых роли:

Administrator 
Manager 
User 

... простой админ типа пользователь, который должен иметь доступ ко всем действиям контроллера:

JoeAdmin 

И следующий контроллер образец Web API:

public IHttpActionResult GetForUsersAndAbove() 
{ 
    // 
} 

public IHttpActionResult GetForAdminsOnly() 
{ 
    // 
} 

Если система будет разработана таким образом, что:

  1. JoeAdmin быть назначен только один - роль администратора или
  2. JoeAdmin быть назначен администратор, менеджер и пользователя?

Мотивация в том, чтобы спросить об этом, когда дело доходит до авторизации действий контроллера. Если JoeAdmin только назначена роль администратора, а затем на основе следующих атрибутов авторизации он не сможет получить доступ к GetForUsersAndAbove(), потому что он не является членом роли пользователя

[Authorize(Roles = "User")] 
public IHttpActionResult GetForUsersAndAbove() 
... 

[Authorize(Roles = "Administrator")] 
public IHttpActionResult GetForAdminsOnly() 
... 

Итак, вопрос, должен GetForUsersAndAbove() быть украшенный

[Authorize(Roles = "User, Manager, Administrator")] 

чтобы у него есть доступ к нему? ИЛИ

Если система должна назначить JoeAdmin по существу все роли так, что он может получить доступ ко всем методам контроллера, даже если они помечены [Authorize(Roles = "User")]?

EDIT

Если я использую следующее соглашение для действий контроллера

[Authorize(Roles = "User")] 
public IHttpActionResult GetForUsers() 

И ожидать, что если JoeAdmin должен иметь доступ этот метод, он также должен быть членом User роли, это приводит к проблема пользовательского интерфейса на воображаемом экране управления пользователями:

Вот сценарий: вы новый пользователь системы, учитывая ответственность за управление пользователями. Вы добавляете нового пользователя JaneAdmin с намерением иметь полный/неограниченный доступ к системе. Вам предлагаются 3 флажка: Administrator, Manager и User. Без документации, которая проведет вас, какие флажки у вас есть? Если я поставил себя на ту обувь пользователя, я бы интуитивно просто пометил «Администратор», ожидая, что он обеспечит полный доступ. Я также могу представить разочарование, когда JaneAdmin считает, что она заблокирована из простых операций на уровне пользователя.Таким образом, пользовательский интерфейс требовал, чтобы все 3 флажка были отмечены галочкой ..., которые удовлетворяют авторизационному аспекту системы, но создают плохой пользовательский интерфейс.

Итак, как обычно можно справиться с этой проблемой?

ответ

1

Вы сами сами отвечаете на свой вопрос. Легче иметь несколько ролей для пользователей, а не указывать все возможные роли на контроллере, потому что роли хранятся в вашей базе данных и могут управляться в любое время, но добавление роли в контроллер требует пересоздания и повторного развертывания вашего проекта.

Также не все администраторы должны иметь доступ ко всем областям. Я видел системы, в которых администраторам разрешалось создавать пользователей и изменять пароль, но не разрешалось просматривать личные медицинские записи.

Так что да, я бы очень рекомендовал назначить несколько ролей для ваших пользователей - это будет проще поддерживать в долгосрочной перспективе.

Редактировать: Итак, вы хотите, чтобы пользователь супер-администратора мог получить доступ в любом месте, не указывая конкретно на все контроллеры? Похоже, вам нужно переопределить AuthorizeAttirbute, чтобы добавить роль администратора, которая будет всегда разрешена.

Что-то вроде этого:

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var authorized = base.AuthorizeCore(httpContext); 
     if (!authorized) 
     { 
      // The user is not authorized => no need to go any further 
      return false; 
     } 


     if(httpContext.User.IsInRole("Admin")) 
     { 
      return true; 
     } 

     return base.AuthorizeCore(httpContext); 
    } 
} 

А потом украсить все контроллеры с этим новым атрибутом:

[MyAuthorize(Roles = "User")] 
public ActionResult MySuperAction() 
{ 
    ... 
} 
+0

Спасибо. Ваш второй пункт имеет большой смысл. По вашей рекомендации, пожалуйста, см. Мой EDIT в вопросе. – BCA

+0

@BCA см. Мое обновление – trailmax

+0

Мне никогда не приходило в голову, что это возможно - спасибо – BCA

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

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