2012-03-07 4 views
1

много статей в Интернете на основе ролей доступа говорить о применении что-то вроде этого, чтобы обеспечить доступ на основе ролей к контроллеру или действияasp.net MVC на основе ролей доступа к контроллеру

[Authorize(Roles = "Admin, Manager")] 
public class SomeController : Controller 
{ 

} 

Все это хорошо, но теперь, если мне нужно реализовать собственный пользовательский доступ на основе роли, в котором у меня есть роли в таблице [RoleMaster] и роли, назначенные пользователю из таблицы [User] в другой таблице с именем [UserRoles]. В моем коде я есть объект пользователя в сессии, которая теперь будет иметь список ролей в нем

public class RegisteredUsers 
{ 

    //... other user properties 

    public List<UserRole> Roles { get; set; } 

} 

public class UserRole 
{ 

    public string RoleID { get; set; } 
    public string RoleName { get; set; } 
    //... other properties 

} 

Теперь, как я могу проверить для свойства UserRole.RoleName в списке ролей в RegisteredUsers объекта в соответствие с любой из значений, которые я присвоил атрибуту Authorize, используя: [Авторизовать (Roles = «Admin, Manager»)]. В некоторых случаях, если роли имеют либо Администратор, либо Менеджер, они должны получить доступ. В некоторых случаях я хочу, чтобы у них был как администратор, так и роль менеджера, чтобы получить доступ.

Кроме того, в будущем, если новые роли будут добавлены в систему, мне нужно будет перестроить и повторно развернуть мое приложение со всеми атрибутами авторизации, переделанными?

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

ответ

3

Вам необходимо реализовать пользовательский IPrincipal (или обычай RoleProvider, но, на мой взгляд, IPrincipal проще).

В вашем контроллере проверки подлинности форм аутентифицируйте свою таблицу пользователей и создайте IPrincipal с ролями из своей таблицы ролей. Вероятно, вы также захотите установить файл cookie Forms Auth, пока вы работаете с его ролями, поэтому вам не нужно удалять базу данных по каждому запросу (или использовать сеанс). Посмотрите на код в this question на примере этого подхода.

Если у вас нет пользовательских атрибутов для пользователей, вы можете использовать встроенные функции GenericIdentity и GenericPrincipal.

Редактировать - если вы храните информацию о пользователях в сессии, вам просто необходимо убедиться, что вы установили HttpContext.Current.User к вашей сессии, полученных IPrincipal в начале каждого запроса (OnPostAuthenticate)

Вам необходимо будет перестроить/передислоцировать, чтобы обслуживать новые роли с помощью этого подхода. Если вы хотите динамически назначать роли и обрабатывать их во время выполнения, вам необходимо реализовать пользовательский атрибут AuthorizationAttribute - это может привести к (например,) параметру «Операция», который может быть сопоставлен с ролями в БД. Я лично оставил бы это, пока не станет очевидно, что вам это нужно.

0

Похоже, что вы можете перерасти в основу дизайна безопасности на основе ролей. Если вам нужны динамические гранулярные или/или привилегии, вы должны начать, по крайней мере, смотреть на более claims-based approach.

Возможно, вы сможете достичь того, что вы описываете, реализуя пользовательский IPrincipal, как показано выше (см. Выше ссылку на ссылки).

Надеюсь, это поможет.

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

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