Возможно ли привязать значение маршрута к свойству пользовательского атрибута в ASP.NET Core Web API?

#c# #asp.net-web-api #asp.net-core

#c# #asp.net-web-api #asp.net-core

Вопрос:

У меня есть пользовательский атрибут, который я использую для авторизации запроса до того, как он попадет в действие контроллера, в ASP.NET Core Web API. На изображении ниже «SecureMethod» является пользовательским атрибутом.

введите описание изображения здесь

Я хочу добавить свойство в пользовательский атрибут, которое я хочу привязать к одному из значений маршрута, пожалуйста, обратитесь к изображению ниже: введите описание изображения здесь

Я хочу привязать значение маршрута «Идентификаторы пользователя» к одному из свойств пользовательского атрибута («Идентификаторы пользователя», это пример атрибута).

Есть ли какой-либо способ привязать значение маршрута к свойству пользовательского атрибута?

TIA

Ответ №1:

Один из способов сделать это — передать имя параметра маршрута атрибуту и изучить данные маршрута в самом атрибуте. Например:

 [SecureMethod(PermissionRequired = AccessPermissionEnum.DeleteUsers, UserIdsKey = "userIds")]
  

Затем что-то вроде:

 public AccessPermissionEnum PermissionRequired { get; set; }
public string UserIdsKey { get; set; }

public override void OnActionExecuting(ActionExecutingContext context)
{
    // Depending on how you pass your userIds to the action, you
    // may need to use something else from context to get the data,
    // but it's all available in there.
    var userIds = context.ActionArguments[UserIdsKey];

    // Do something with the ids.

    base.OnActionExecuting(context);
}
  

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

Комментарии:

1. спасибо, Джон! существует ограничение, поскольку не каждое действие будет иметь это. Мне нужен этот дополнительный атрибут-свойство, установленный только для определенных действий. И поэтому я надеялся предоставить это через свойство атрибута.

2. @SunnySharma Это прекрасно. Это свойство, поэтому для него не требуется значение (параметр является общедоступным). Это был бы случай посмотреть, действительно ли свойство имеет значение, а затем использовать это, чтобы вытащить что-то из контекста, в противном случае не получить значение маршрута.

3. Конечно, Джон, я имел в виду, что имя переменной «UserIdsKey» не является фиксированным, для разных действий это может быть другой параметр, поэтому я хотел сопоставление на основе строк в самом свойстве пользовательского атрибута!

4. @SunnySharma UserIdsKey не имеет значения, вам просто нужно передать правильное имя параметра UserIdsKey . И context.ActionArguments[UserIdsKey] он получит значение вашего параметра.

Ответ №2:

Нет, это невозможно.

Параметры атрибута ограничены постоянными значениями следующих типов:

  • Простые типы (bool, byte, char, short, int, long, float и double)

  • строка

  • Система.Тип

  • перечисления

  • объект (Аргумент параметра атрибута типа object должен быть постоянным значением одного из вышеуказанных типов.)

  • Одномерные массивы любого из вышеуказанных типов

Вы не можете вкладывать атрибуты и передавать непостоянные значения параметру атрибута. Даже если вы можете объявить параметр атрибута как тип object, фактический аргумент, который вы передаете, все равно должен быть постоянной строкой, bool и т.д. (Объявление его как объекта просто означает, что вы можете использовать любой из этих типов при каждом объявлении атрибута).