MVC: ¿creando un [AuthorizeAttribute] personalizado que toma parámetros?

Aquí está mi problema:

Estoy autorizando a los usuarios en sus roles, por 1 parte.

 [Authorize(Roles = "Admin,...")]
 public class ModulesController : Controller {
    .....
 }

el controlador de Módulos muestra una lista de módulos a los que el usuario tiene derecho. (hay MUCHOS módulos, pero el usuario solo está conectado a una parte de ellos). hay un montón de cosas acopladas a los módulos, como preguntas, ...

por ejemplo: la vista de detalles del controlador de Módulos.

    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");
    }

con este código verifico si este usuario está acoplado al módulo especificado que solicitó para ver sus detalles.

No me gusta este método, ya que no siempre devuelvo unModule Desde mi punto de vista, esto tiene muchos métodos de sobrecarga, y para las subpáginas de los módulos, como las Preguntas, también necesito verificar que la persona esté mirando las preguntas de un módulo al que tenga acceso.

Me gustaría hacer esto con un atributo de autorización, que tomaría la ID del Módulo, y con eso otorgaría o denegaría el acceso a ese determinado módulo. Mi problema es que, cuando un usuario solicita ver una pregunta, necesito averiguar la ID del módulo con algún código. A veces, el moduleID está en la URL, pero este no es siempre el caso.

¿Cómo haría esto? ¿sería bueno intentar usar el atributo? ¿o necesito hacer esto de manera diferente?

Editar:

Estoy intentando lo que se sugiere en las respuestas, pero ¿cómo obtengo routedata (como ID) en el constructor de controladores?

Respuestas a la pregunta(1)

Su respuesta a la pregunta