2011-01-13 4 views
0

вот моя проблема: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) в конструкторе контроллеров?

ответ

2

См: Asp.net mvc authorize attribute integrated with a parameter

Действительно стрельнул соответствующий поиск не задираться на эти вещи ...

+0

стрельнул а :) – Stefanvds

+0

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

+0

Я не могу заставить это работать, поскольку мне нужен ID из URL – Stefanvds