Динамический атрибут авторизации удостоверения MVC5 ASP

У меня есть проект MVC5 с бэкэндом для настройки того, какая роль может получить доступ к какому меню. Обычный способ реализации авторизации на основе ролей выглядит примерно так.

[Authorize(Roles="Admin")]
public ActionResult UpdateProduct(ProductModel model)
{
     //do something
     return View(model);
}

Поскольку мне нужны динамичные роли, я думал о чем-то подобном.

[Authorize(Roles=GetRoles("UpdateProduct"))]
public ActionResult UpdateProduct(ProductModel model)
{
     //do something
     return View(model);
}

И, очевидно, это не работает, потому что атрибуты являются статическими метаданными.

Я осмотрелся и нашел эту динамическую авторизацию MVC 3 для нескольких ролей и пользователей, но есть ли более чистый способ добиться этого?

Примечание. Я стараюсь избегать вызова User.IsInRole в каждом методе.


person warheat1990    schedule 27.05.2015    source источник


Ответы (1)


Определение атрибута кода в C# состоит в том, что он статичен, поэтому у вас не может быть метода GetRoles().

Вы предложили хотеть такой атрибут, как:

[Authorize(Roles=GetRoles("UpdateProduct"))]

Это означает, что вам придется реализовать GetRoles() в своем коде, поэтому используйте настраиваемый атрибут, производный от Authorize.

    public class CustomAuthorizeAttribute : AuthorizeAttribute
    {

        public CustomAuthorizeAttribute(string roleSelector)
        {

            Roles = GetRoles(roleSelector);
        }

        private string GetRoles(string roleSelector)
        {
            // Do something to get the dynamic list of roles instead of returning a hardcoded string
            return "Somerole";
        }
}

Итак, теперь вы можете сделать:

[CustomAuthorize("updateProduct")]

person Nicknow    schedule 27.05.2015