Ця проблема переслідує мене вже кілька днів, тому, знаходячи відповідь, яка ствердно працює з відповіддю tvanfosson вище, я вважав, що варто підкреслити основну частину відповіді та розглянути деякі пов’язані з цим проблеми.
Основна відповідь така, мила і проста:
filterContext.Result = new HttpUnauthorizedResult();
У моєму випадку я успадковую від базового контролера, тому в кожному контролері, який успадковує від нього, я замінюю OnAuthorize:
protected override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
YourAuth(filterContext);
}
Проблема полягала в тому, що у "YourAuth" я спробував дві речі, які, на мою думку, не лише спрацюють, але й негайно припинять запит. Ну, це не так це працює. Отже, спочатку дві речі, які НЕ працюють, несподівано:
filterContext.RequestContext.HttpContext.Response.Redirect("/Login");
FormsAuthentication.RedirectToLoginPage();
Вони не тільки не працюють, вони також не закінчують запит. Це означає наступне:
if (!success) {
filterContext.Result = new HttpUnauthorizedResult();
}
DoMoreStuffNowThatYouThinkYourAuthorized();
Ну, навіть при правильній відповіді вище, потік логіки все одно триває! Ви все одно натиснете DoMoreStuff ... в OnAuthorize. Тож майте це на увазі (отже DoMore ... повинен бути в іншому).
Але з правильною відповіддю, поки потік логіки OnAuthorize продовжується до кінця, після цього ви дійсно отримуєте те, що очікуєте: переспрямування на вашу сторінку входу (якщо у вас є одна установка в Forms auth у вашому webconfig).
Але несподівано, 1) Response.Redirect ("/ Login") не працює: метод Action все ще викликається, і 2) FormsAuthentication.RedirectToLoginPage (); робить те саме: метод Action все ще викликається!
Що мені здається абсолютно неправильним, особливо з останнім: хто б міг подумати, що FormsAuthentication.RedirectToLoginPage не закінчує запит або робить еквівалент вище того, що робить filterContext.Result = new HttpUnauthorizedResult ()?