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, который будет принимать идентификатор из модуля, а также предоставит или запретит доступ к этому определенному модулю. Моя проблема в том, что когда пользователь запрашивает вопрос, мне нужно определить идентификатор модуля с помощью некоторого кода. Иногда ID модуля находится в URL, но это не всегда так.
как бы я это сделал? было бы хорошо попробовать и использовать атрибут? или мне нужно сделать это по другому?
Редактировать:
я пытаюсь, что предлагается в ответах, но как я могу получить Routedata (например, ID) в конструкторе контроллеров?
1 ответ
См.: Asp.net mvc атрибут авторизации, интегрированный с параметром
Действительно смущенный связанный поиск не улавливает эти вещи...