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 в атрибуте?

7
задан DM. 18 April 2010 в 06:58
поделиться

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);
11
ответ дан 6 December 2019 в 23:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: