Атрибуты контроллера ASP.Net MVC выполняются до или после действия? - PullRequest
2 голосов
/ 04 августа 2010

Рассмотрим следующий код:

    [Authenticate(Order = 1)]
    public ActionResult SomeActionThatRequiresAuthentication()
    { 
        var model = new SomeViewModel(); 
        // Do something with an authenticated session/user...
        return View(model);
    }

Имеется ли атрибут Authenticate до или после выполнения кода внутри метода SomeActionThatRequiresAuthentication?

Я спрашиваю об этом, потому что у меня есть Атрибут, который делает что-то вроде этого:

    public class Authenticate : CustomAuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (!UserService.IsAuthenticated && !HttpContext.Current.Response.IsRequestBeingRedirected)
            HttpContext.Current.Response.Redirect(ViewUtil.Actions.User.LogOnUrl());
    }
}

Как видите, атрибут будет перенаправлять пользователя, если пользователь не аутентифицирован. Однако представляется, что перенаправление происходит только после выполнения действия. Это вызывает проблемы, потому что я сделал предположение, что пользователь аутентифицируется при выполнении действия. Сначала я должен понять, должны ли атрибуты произойти до или после выполнения действия, или я считаю, что рабочий процесс совершенно неверный?

Спасибо, Пол


После более подробного изучения становится ясно, что filterContext.Result должен быть установлен, чтобы это работало. После внесения небольшого изменения в мой атрибут Authorize он теперь работает:

    public class Authenticate : CustomAuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (!UserService.IsAuthenticated && !HttpContext.Current.Response.IsRequestBeingRedirected)
            filterContext.Result = new RedirectResult(ViewUtil.Actions.User.LogOnUrl());
    }
}

1 Ответ

4 голосов
/ 04 августа 2010

Вы правы, атрибуты выполняют до рассматриваемого действия, поэтому [Authenticate] наверняка должно выполняться первым, и, если пользователь не аутентифицирован, код действия никогда не выполняется до тех пор, пока пользователь не будетперенаправляется, аутентифицируется и перенаправляется обратно к этому действию.

Редактирование на основе комментария : метод MVC Framework OnAuthorizatrion (источник здесь ) не перенаправляет,но устанавливает для filterContext.Result значение HttpUnauthorizedResult () (которое просто устанавливает код состояния 401).Этот результат заставляет модуль аутентификации перенаправить пользователя на страницу входа.Предполагая, что остальная часть вашей пользовательской реализации стандартна (не переопределяет или не вызывает базовые методы), изменяя это

HttpContext.Current.Response.Redirect(ViewUtil.Actions.User.LogOnUrl()); 

на это (или что-то подобное, если вы установили Результат)

filterContext.Result = new HttpUnauthorizedResult();

должен добиться цели, по крайней мере, продвинуться дальше по дороге.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...