Авторизовать текущего пользователя против контроллера и имени действия в ASP.NET MVC 3

Мне нужно создать настраиваемую авторизацию в ASP.NET MVC 3. Внутри приложения авторизация определяется в 5 таблицах: пользователи, группы, группы пользователей, права, grouprights. Пользователь может принадлежать нескольким группам, и каждое право может быть назначено нескольким группам. Каждому действию контроллера присваивается значение RightID.

Встроенная авторизация не может соответствовать этой настройке, поэтому я попытался создать настраиваемый атрибут AuthorizeAttribute. При переопределении AuthorizeCore я понял, что у меня нет доступа к имени контроллера и имени действия.

Могу ли я каким-то образом попросить маршрутизатора проанализировать Request.RawUrl внутри AuthorizeCore, чтобы получить имя контроллера и действия? Или есть другой способ сделать то, что я хочу?

Ответы

Ответ 1

protected override bool AuthorizeCore(HttpContextBase httpContext)
{
    var routeData = httpContext.Request.RequestContext.RouteData;
    var controller = routeData.GetRequiredString("controller");
    var action = routeData.GetRequiredString("action");
    ...
}

Ответ 2

Вы можете достичь этого, используя Action Filters, где у вас есть доступ ко всем HttpContex.

public class MyAuthorizeAttribute : ActionFilterAttribute, IAuthorizationFilter
{

    #region Implementation of IAuthorizationFilter

    public void OnAuthorization(AuthorizationContext filterContext)
    {
              // ... implementation

              // filterContext.Controller is the controller
              // filterContext.RouteData is all the route data