asp.net MVC основанный на роли доступ к контроллеру - PullRequest
1 голос
/ 07 марта 2012

Многие статьи онлайн о доступе на основе ролей говорят о применении чего-то подобного для обеспечения доступа на основе ролей к контроллеру или действию

[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, используя: [Authorize (Roles = "Admin, Manager")] , В некоторых случаях, если роли имеют администратора или менеджера, они должны получить доступ. В некоторых случаях я хочу, чтобы у них были права администратора и администратора, чтобы получить доступ.

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

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

Ответы [ 2 ]

3 голосов
/ 07 марта 2012

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

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

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

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

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

0 голосов
/ 07 марта 2012

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

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

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

...