Не претендую на истину в последней инстанции, но я недавно эту задачу так решал:
В базе завел сущности
1) page {controller, action},
2) userrole {pages}
3) user {userroles}
Создаем страницу или автоматически на основе контроллеров этот список билдим, а не в базе храним, создаем роль, присваиваем роли страницы и соответственно юзеру даем разные роли.
Далее делаем свой атриубут и наследуемся от AuthorizeAttribute, оверрайдим AuthorizeCore, внутри получаем через httpContext.Request.RequestContext.RouteData имя запрашиваемого контроллера и метода, httpContext.User.Identity.Name получаем имя юзера, ну а дальше дело техники, получаем его роли, страницы и смотрим пускать или нет.
атрибут можно писать как над методами, так и над всем контроллером.