AuthorizeAttribute с ролями, но без жесткого кодирования значений ролей

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

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

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

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

2 ответа

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

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));
    }
}

Я надеюсь, что это поможет вам.

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

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

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

}
Другие вопросы по тегам