#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 и т.д. (Объявление его как объекта просто означает, что вы можете использовать любой из этих типов при каждом объявлении атрибута).