7

У меня есть сценарий, который я не был в состоянии решить: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 в атрибуте?

ответ

11

Вы можете переопределить 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); 
+1

Brilliant, ТНХ. Посмотрев на ваш ответ, я понял, что могу просто спросить: «Как мне получить доступ к AuthorizationContext». Как только у меня это, я опасен. –

+0

Примечание: реализация метода OnAuthorization() не является тривиальным упражнением. Если вы решили переопределить OnAuthorization() вместо AuthorizeCore(), добавьте код в OnAuthorization(), чтобы отключить или перехватить кэширование вывода. См. Http://forums.asp.net/p/1533590/3737756.aspx для получения дополнительной информации. – Levi

Смежные вопросы