вот моя проблема:MVC: создание пользовательского [AuthorizeAttribute], который принимает параметры?
Я разрешаю пользователям выполнять их роли на 1 часть.
[Authorize(Roles = "Admin,...")]
public class ModulesController : Controller {
.....
}
Контроллер модулей отображает список модулей, на которые пользователь имеет право. (есть много модулей, но пользователь подключен только к их части). есть нагрузка вещей, связанных с модулями, например вопросы, ...
например: вид детали контроллера модулей.
public ActionResult Details(int id) {
var mod = (from p in _db.Modules
where p.Mod_ID == id
select p).First();
return accessible(mod);
}
[NonAction]
public ActionResult accessible(Module p) {
if (MvcApplication.accessible(HttpContext.User, p.Mod_ID)) {
return View(p);
}
ViewData["delError"] = "Not Accessible";
return View("Error");
}
с этим кодом Я проверяю, связан ли этот пользователь с указанным модулем, который он запросил, чтобы просмотреть его данные.
Мне не нравится этот метод, так как я не всегда возвращаю Module
на мой взгляд, поэтому у этого есть много методов перегрузки, а для вспомогательных страниц модулей, таких как Вопросы, мне также нужно проверить что человек смотрит на вопросы модуля, к которому у него есть доступ.
Я хотел бы сделать это с помощью атрибута authorize, который будет принимать идентификатор из модуля, и с этим предоставит или запретит доступ к определенному модулю. Моя проблема заключается в том, что когда пользователь запрашивает вопрос, мне нужно выяснить идентификатор модуля с некоторым кодом. Иногда moduleID находится в URL-адресе, но это не всегда так.
как бы я это сделал? было бы неплохо попробовать использовать этот атрибут? или мне нужно сделать это по-другому?
Edit:
я пытаюсь, что в настоящее время предлагается в ответах, но как я могу получить routedata (например, ID) в конструкторе контроллеров?
стрельнул а :) – Stefanvds
Я прочитал, и я думаю, что это то, что мне нужно , но прямо сейчас получите идентификатор одного модуля в своем действии, а не в контроллере. Если я правильно понял, мне нужно создать конструктор в каждом контроллере, который будет использовать этот атрибут, который затем вернет идентификатор модуля. – Stefanvds
Я не могу заставить это работать, поскольку мне нужен ID из URL – Stefanvds