AuthorizeAttribute с ролями, но без жесткого кодирования значений ролей - PullRequest
4 голосов
/ 28 января 2012

Можно ли добавить роли, но без жесткого кодирования значений, таких как:

[Authorize(Roles="members, admin")]

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

Я знаю, с помощью перечислений это можно сделать ... http://www.vivienchevallier.com/Articles/create-a-custom-authorizeattribute-that-accepts-parameters-of-type-enum, но даже это все еще недостаточно гибко для моих нужд;это все еще что-то вроде жесткого кода, хотя он и чище.

Ответы [ 2 ]

9 голосов
/ 29 января 2012

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

public class ConfigAuthorizationAttribute: AuthorizeAttribute
{
    private readonly IActionRoleConfigService configService;
    private readonly IUserRoleService roleService;

    private string actionName;

    public ConfigAuthorizationAttribute()
    {
        configService = new ActionRoleConfigService();
        roleService = new UserRoleService();
    }

    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        actionName = filterContext.ActionDescription.ActionName;
        base.OnAuthorization(filterContext);
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var availableRoles = configService.GetActionRoles(actionName); // return list of strings
        var userName = httpContext.User.Identity.Name;
        var userRoles = roleService.GetUserRoles(userName); // return list of strings
        return availableRoles.Any(x => userRoles.Contains(x));
    }
}

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

3 голосов
/ 28 января 2012

Одним из решений было бы создание промежуточного объекта под названием «Группа», в котором пользователи добавляются в группы (например, «Админ», «Поддержка»), и группы имеют набор ролей. (например: Создать пользователей). Таким образом, вы можете жестко кодировать роли и настраивать отношения между пользователями и группами.

Вам потребуется реализовать пользовательский поставщик ролей. Пройдите Реализация ролевого провайдера на MSDN

[Authorize(Roles="CreateUser")]
public ActionResult Create()
{

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...