UrlHelper и ViewContext внутри атрибута авторизации

У меня есть сценарий, который я не смог решить:

Я пытаюсь создать свой собственный атрибут авторизации для mvc. Основная функциональность, которую я хотел бы добавить, - это возможность изменить место перенаправления пользователя, если он не находится в определенной роли. Я не возражаю, если система отправляет их обратно на страницу входа в систему, если они не аутентифицированы, но я хотел бы выбрать, куда их отправлять, если они аутентифицированы, но не имеют доступа к этому методу действия.

Вот что я хотел бы сделать:

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
        public string Action;
        public string Controller;

        protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
        {
            // if User is authenticated but not in the correct role
            string url = Url.Action(this.Action, this.Controller);                
            httpContext.Response.Redirect(url);
        }
    }

И в качестве дополнительного бонуса я хотел бы иметь доступ к ViewContext и TempData, прежде чем делать перенаправление.

Есть мысли о том, как я могу создать экземпляр UrlHelper и ViewContext в атрибуте?


person DM.    schedule 18.04.2010    source источник


Ответы (1)


Вы можете переопределить метод OnAuthorization:

public override void OnAuthorization(AuthorizationContext filterContext)
{
    if (filterContext == null)
    {
        throw new ArgumentNullException("filterContext");
    }

    // Call the AuthorizeCore which should return true or false
    if (!this.AuthorizeCore(filterContext.HttpContext))
    {
        filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary()
        {
            { "controller", "home" },
            { "action", "about" },
            { "id", "foo" },
        });
    }
}

Что касается ViewData и TempData: filterContext.Controller.ViewData и filterContext.Controller.TempData должны работать внутри метода OnAuthorization. И, наконец, если вы хотите использовать UrlHelper (в этом случае нет необходимости, потому что RedirectToRouteResult лучше), вы можете создать его экземпляр:

var urlHelper = new UrlHelper(filterContext.RequestContext);
person Darin Dimitrov    schedule 18.04.2010
comment
Великолепно, спасибо. Посмотрев на ваш ответ, я понял, что мог просто спросить, как мне получить AuthorizationContext. Когда я это получу, я опасен. - person DM.; 19.04.2010
comment
Примечание. Реализация метода OnAuthorization () - нетривиальное упражнение. Если вы решите переопределить OnAuthorization () вместо AuthorizeCore (), добавьте код в OnAuthorization (), чтобы отключить или перехватить кеширование вывода. См. forum.asp.net/p/1533590/3737756.aspx для получения дополнительной информации. Информация. - person Levi; 19.04.2010