ASP.NET MVC: проблема, устанавливающая Авторизовать Роль атрибута от переменной, требует константы

Хотя я недавно стал конвертером в dplyr для большинства этих типов операций, пакет sqldf по-прежнему очень хорош (и IMHO более читабельным) для некоторых вещей.

Вот пример того, как можно ответить на этот вопрос с помощью sqldf

x <- data.frame(Category=factor(c("First", "First", "First", "Second",
                                  "Third", "Third", "Second")), 
                Frequency=c(10,15,5,2,14,20,3))

sqldf("select 
          Category
          ,sum(Frequency) as Frequency 
       from x 
       group by 
          Category")

##   Category Frequency
## 1    First        30
## 2   Second         5
## 3    Third        34
15
задан tsquillario 18 December 2008 в 01:52
поделиться

4 ответа

Можно использовать User.InRole( "RoleName" ) в контроллере.

РЕДАКТИРОВАНИЕ: код ниже не будет работать, так как GetCustomAttributes (), по-видимому, возвращает копию каждого атрибута вместо ссылки на фактический атрибут. Оставленный как ответ обеспечить контекст для других ответов.

До установки его в авторизовать атрибуте, единственная идея, что я имею, состоит в том, чтобы установить его на пустую строку в определении атрибута, затем использовать отражение о типе контроллера, чтобы получить и изменить свойство CustomAttribute, соответствующее AuthorizeAttribute (т.е. тот, типом которого является AuthorizeAttribute) для каждого метода, о котором Вы заботитесь. Необходимо смочь установить свойство Roles на элемент конфигурации тот путь.

var attributes = typeof(MyController).GetMethod("Index")
                                     .GetCustomAttributes(typeof(AuthorizeAttribute),
                                                          false)
                 as AuthorizeAttribute;

attributes[0].Roles = Config.GMPUser;

я предполагаю, что Вы сделали бы, это в Вашем файле Global.asax на приложении запускается так, чтобы это только было сделано однажды.

2
ответ дан 1 December 2019 в 04:18
поделиться

Атрибуты записываются во время компиляции, поэтому, как обозначено, можно только использовать их с константами. Вы также не можете изменить атрибуты, с тех пор даже если это, кажется, позволяет Вам, это не "придерживается" в следующий раз, когда Вы достаете значение назад. tvanfosson's User.InRole( "RoleName" ) является, вероятно, наилучшим вариантом (у него есть мои +1).

Только для иллюстрирования проблемы с обновлением атрибутов:

class FooAttribute : Attribute
{
    public string Bar { get; set; }
}
static class Program
{
    [Foo(Bar="abc")]
    public static void Main()
    {
        MethodInfo method = typeof(Program).GetMethod("Main");
        var attrib = (FooAttribute) Attribute.GetCustomAttribute(method, typeof(FooAttribute));
        Console.WriteLine("Original: " + attrib.Bar);
        attrib.Bar = "def";
        Console.WriteLine("Updated: " + attrib.Bar);
        attrib = (FooAttribute)Attribute.GetCustomAttribute(method, typeof(FooAttribute));
        Console.WriteLine("Look again: " + attrib.Bar);
    }
}

Печать:

Original: abc
Updated: def
Look again: abc
4
ответ дан 1 December 2019 в 04:18
поделиться

У меня есть класс под названием StringResources, который обеспечивает доступ к статическим строковым значениям. Я столкнулся с тем же препятствием и решил проблему следующим образом. Я наследовался классу AuthorizeAttribute и добавил переопределение метода для метода AuthorizeCore. Функциональность метода имела вызов к IsInRole () и передачи в статическом свойстве строки. Это добилось цели. Единственная проблема должна создать отдельные классы для каждой роли (или для комбинаций ролей в любом способе Ваша бизнес-логика диктует).

public class SystemAdministratorAuthorizationRequiredAttribute
        : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(System.Security.Principal.IPrincipal user)
        {
            return
                user.IsInRole(
                StringResources.AdministrationViewsStrings.SystemAdministratorRoleName
                );
        }
    }
7
ответ дан 1 December 2019 в 04:18
поделиться

Создайте пользовательский атрибут подобно этому (слегка измененная версия, предоставленная блогом Дэвида Хейдена):

public class MyCustomAuthorizeAttribute : AuthorizeAttribute
{
    public IAuthorizationService _authorizationService = new MyAuthorizationService();

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
       return _authorizationService.Authorize(httpContext);
    }
}

и применяйте его подобно этому:

[MyCustomAuthorize]
public ActionResult Create()
{
    return View();
}

теперь вы можете поместить всю вашу пользовательскую логику авторизации в свой собственный класс MyAuthorizationService. Замечание: в решении davids вы можете установить внутренний MyAuthorizationService с помощью предоставленного аксессуара. Не уверен, что вы сможете передать ему новую функцию MyAuthorizationService(). Не пробовал.

2
ответ дан 1 December 2019 в 04:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: