Можно ли передать параметр метода в атрибут для этого метода? - PullRequest
3 голосов
/ 04 октября 2011

Я хочу создать собственный класс AuthorizeAttribute, как описано здесь: Переопределить атрибут авторизации в ASP.NET MVC .

Хитрость в том, авторизован пользователь или нет, зависит не тольков каком методе он работает, но также и в параметре:

[MyCustomAuthorize(id)]
[HttpGet]
public ActionResult File(Guid id)
{

}

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

Я знаю, что мог бы сделать логику, чтобы убедиться, что у пользователя есть доступ к этому файлу в начале метода, но у меня есть несколько методов, которым все это нужно было бы сделать, и было бы намного чище, если бы я мог сделать это как часть атрибута [Authorize].

Ответы [ 2 ]

1 голос
/ 04 октября 2011

Нет, это не разрешено C #.

Однако вы можете получить доступ к RouteValues внутри подтипа AuthorizeAttribute

Внутри, например, OnAuthorization, вы можете сделать:

object id = filterContext.RouteData.Values["id"];

Будьте осторожны.Вы действительно должны знать, что вы здесь делаете.Взаимодействие между аутентификацией, авторизацией и кэшированием является сложным.

0 голосов
/ 28 октября 2015

Возможно, последний ответ в 2011 году был верным для этой версии ОДНАКО это возможно. Создайте публичный int (или все, что вам нужно) и используйте его. Пример:

public class RestrictToTemplateManagers : AuthorizeAttribute
{
    public string GUID { get; set; }
}

[RestrictToTemplateManagers(GUID="ABC")]
public class ImportTemplatesController : Controller
{

}
...