Эта проблема преследует меня уже несколько дней, поэтому, найдя ответ, который утвердительно работает с ответом tvanfosson выше, я подумал, что было бы целесообразно выделить основную часть ответа и обратиться к некоторому связанному с ним улову.
Основной ответ такой, милый и простой:
filterContext.Result = new HttpUnauthorizedResult();
В моем случае я наследую от базового контроллера, поэтому в каждом контроллере, который наследует от него, я переопределяю OnAuthorize:
protected override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
YourAuth(filterContext); // do your own authorization logic here
}
Проблема заключалась в том, что в «YourAuth» я пробовал две вещи, которые, по моему мнению, не только работали, но и немедленно прекращали запрос. Ну, это не так, как это работает. Итак, сначала две вещи, которые НЕ работают, неожиданно:
filterContext.RequestContext.HttpContext.Response.Redirect("/Login"); // doesn't work!
FormsAuthentication.RedirectToLoginPage(); // doesn't work!
Они не только не работают, но и не заканчивают запрос. Что означает следующее:
if (!success) {
filterContext.Result = new HttpUnauthorizedResult();
}
DoMoreStuffNowThatYouThinkYourAuthorized();
Ну, даже с правильным ответом выше, поток логики все еще продолжается! Вы все равно нажмете DoMoreStuff ... в OnAuthorize. Так что имейте это в виду (DoMore ... поэтому должен быть в другом).
Но с правильным ответом, пока поток логики OnAuthorize продолжается до самого конца, после этого вы действительно получаете то, что ожидаете: перенаправление на вашу страницу входа (если у вас есть один установленный в Autms Forms в вашем webconfig).
Но неожиданно,
1) Response.Redirect ("/ Login") не работает: метод Action по-прежнему вызывается, и
2) FormsAuthentication.RedirectToLoginPage (); делает то же самое: метод Action по-прежнему вызывается!
Что мне кажется совершенно неправильным, особенно в отношении последнего: кто бы мог подумать, что FormsAuthentication.RedirectToLoginPage не завершает запрос, или делает эквивалент выше того, что делает filterContext.Result = new HttpUnauthorizedResult ()?