2015-02-18 6 views
0

У меня есть пользовательский AuthorizeAttribute на моем сайте. У этого есть некоторая логика относительно Result, созданного для неаризованных запросов.Проверка авторизации триггера вручную

В некоторых случаях я хочу активировать его проверку вручную *. Я не знаю, возможно ли это. Поскольку я не нашел, как это сделать, я подумал, что я мог бы извлечь логику, чтобы получить Result, чтобы получить отличный метод и называть его, когда захочу. Но тогда я не знаю, как выполнить ActionResult (вне контроллеров).

Как это сделать, чтобы вручную выполнить авторизацию? Если это невозможно, как мне сделать, чтобы выполнить ActionResult вне контроллера?

* Мне нужно вызвать его вручную, потому что некоторый запрос может пройти проверку (потому что сеанс создан), а затем при доступе к моим службам обнаружил, что сеанс был закрыт кем-то другим. Я бы не хотел, чтобы добавить призывы к услугам в OnAuthorization, чтобы уменьшить количество вызовов служб.

ответ

0

Я не уверен, что это лучшее, но я нашел способ заставить его работать (все еще слушаю лучшие ответы).

  1. Когда я вызываю службы и замечаю, что рабочий сеанс истек, все, что я делаю, - это удаление активного пользователя в веб-сеансе.
  2. Мой пользовательский атрибут authorize также реализует IResultFilter и IExceptionFilter.
  3. И в OnResultExecuted, и OnException Я снова проверяю активного пользователя. Если сеанс был удален, примените тот же ActionResult, который я бы применил в OnAuthorization.

Вот конечный класс:

public class CustomAuthorizeAttribute : AuthorizeAttribute, IResultFilter, IExceptionFilter 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     ActionResult result = Validate(filterContext.HttpContext); 

     if (result != null) 
      filterContext.Result = result; 
    } 

    public void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     ActionResult result = Validate(filterContext.HttpContext); 

     if (result != null) 
      filterContext.Result = result; 
    } 

    public void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
    } 

    public void OnException(ExceptionContext filterContext) 
    { 
     ActionResult result = Validate(filterContext.HttpContext); 

     if (result != null) 
     { 
      filterContext.Result = result; 
      filterContext.ExceptionHandled = true; 
     } 
    } 

    public static ActionResult Validate(HttpContextBase httpContext) 
    { 
     if (UserActiveInSession) 
      return null; 

     // Different rules to build an ActionResult for this specific case. 
    } 
}